php正则表达式以时间单位拼写数字


php-regex spell out numbers for units of time

我是正则表达式的新手。我想拼出小于10的数字,这些数字不是度量单位(厘米、毫米、米等)。我试过这个。。

<?php
//spell out the numbers less than 10 which are not units of time
$match="5 feet";
if(preg_match('/('d+)'s((?i)(?:j|kg|mm|cm|km|cu|ft|nm|khz|mhz|w|kw|sq|gb|kb|ghz|thz/',$match))
{
echo $match;
}
else
{
$replacement='$1 $2';
$x=preg_replace('/('d+)'s((?i)(?:j|kg|mm|cm|km|cu|ft|nm|khz|mhz|w|kw|sq|gb|kb|ghz|thz))/',$replacement,$match);
}
echo convert($x);
function convert($string)
{
$spell = array('zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine');
$num = range(0, 9);
return str_replace($num, $spell, $string);
}
?>

它正在为指定的单元工作。有更好的方法吗。我还想拼出所有单位的名字。

样本输出:

Input: 5 cm 5 mm
Output: 5 cm 5 mm
Input: 5 car 5 mm
Output: five car 5 mm

正如ling.s所说,数组是正确的方法,但您可以使用preg_replace_callback来极大地简化代码。要做到这一点,你需要搜索而不是的数字,然后是一个测量值,这使用了"(?!…)",所以这个:

(/d+)(?!'s*(?:mm|kg)) 

匹配任何后面没有"mm"的数字,即"?:"告诉系统不要将mm/kg作为匹配项返回,即使它在括号中。如果您有一个单元阵列,那么使用implode($units, "|")很容易获得内部reg exp部件。您可以将所有这些放在一起,得到一个只匹配数字而不匹配度量值的正则表达式。

现在,您可以稍微更改转换函数,使其与preg_replace_callback的回调兼容,所需的只是接受第一个元素完全匹配的数组:

function convert($matches)
{    
    $spell = array('zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine');
    $num = range(0, 9);
    return str_replace($num, $spell, $matches[0]);
}

这将为每个匹配调用,并用返回的字符串替换该匹配,其余代码为:

function fix_numbers($match) { 
  $units = array("j","kg","mm","cm","km","cu","ft");
  // Lookahead for unit match 
  $regex = "/('d+)(?!'s*(?:".implode($units, "|")."))/";
  return preg_replace_callback($regex, "convert", $match); 
}

测试代码:

echo fix_numbers("5 feet 6 mm 3 trees") . "'n";
echo fix_numbers("5 cm 5 mm") . "'n";
echo fix_numbers("5 car 5 mm") . "'n";

输出:

five feet 6 mm three trees
5 cm 5 mm
five car 5 mm

现在,仍然存在一个潜在的问题——对于像"cu"这样的单元,它也会匹配像"cube"这样的文本,所以你可能想在单元后面搜索一个空格。但这让上一场比赛变得更加复杂。这实际上取决于你的输入是什么

此外,您的转换功能是有限的,如果您想用功能更全面的版本取代它,还有很多其他选项(即:http://www.karlrixon.co.uk/writing/convert-numbers-to-words-with-php/)

创建一个允许的单元数组,然后使用您的模式。

试试之类的东西

$units = array("kg", "mm", "cm", "km");
preg_match(....);