我在数组中有几个正则表达式并测试一些字符串。
$results = array();
$testString = 'The distance is 0,1 km. It is above 200 m.';
$regex = array(
'distance' => '/The distance is (?P<distance>\d+) m\./',
'distance' => '/The distance is (?P<distance>\d+(,\d+)?) km\./',
'height' => '/It is above (?P<height>\d+) m\./'
'height' => '/It is above (?P<height>\d+(,\d+)?) km\./'
);
foreach ($regex as $key => $reg) {
if (preg_match($reg, $testString, $matches)) {
$results[] = array('type' => $key, 'value' => $matches[$key]);
}
}
我想将结果存储为“米”,但在上面的测试字符串中,匹配“km”-regex。
我可以为正则表达式代码添加一些魔法,因此它会将匹配的0,1
转换为100
(=匹配* 1000)吗?
在正则表达式代码中完成它是完美的,所以我不必在PHP代码中添加异常。
感谢您的帮助! :)
沃尔夫
答案 0 :(得分:2)
如果你想要肮脏的技巧,你可以在分配字符串之后做这样的事情:
$testString = preg_replace('/(\d+)(?:,(\d+))?(\s*)km\b/e', '($1.$2 * 1000)."$3m"', $testString);
PS :你不能在你的正则表达式中直接这样做(无论如何都是PHP),你必须在某个地方使用一些代码才能工作。
解释:它匹配数字后跟km
,捕获整数和小数部分,然后用替换中的PHP代码结果替换它们:
(<integer>.<decimal> * 1000)."<space>m"
评估代码是因为使用了/e
标志。
答案 1 :(得分:0)
我不知道0,1将等于1000.但是如果您正在寻找基于正则表达式的替换,请检查此函数:http://php.net/manual/en/function.preg-replace-callback.php。对于简单的替换,您可以使用preg_replace,但我无法弄清楚转换背后的逻辑。
答案 2 :(得分:0)
不,我认为你不能将这样的逻辑添加到正则表达式中。我会更改您的正则表达式,以便匹配值(\d+(,\d+)?)
和单位(m|km)
。然后使用类似
$value = floatval(str_replace(',', '.', $value));
根据单位的不同,您可以将此值标准化为米
case ($unit) {
case 'km':
$value *= 1000;
break;
}
答案 3 :(得分:0)
嗯,不是直接regex
解决方案,而只是做你需要的
$results = array();
$testString = 'The distance is 0,1 km. It is above 200 m.';
$regex = array(
'distance' => '/The distance is (?P<distance>\d+) (?P<unit>m)\./',
'distance' => '/The distance is (?P<distance>\d+(,\d+)?) (?P<unit>km)\./',
'height' => '/It is above (?P<height>\d+) (?P<unit>m)\./',
'height' => '/It is above (?P<height>\d+(,\d+)?) (?P<unit>km)\./'
);
foreach ($regex as $key => $reg) {
if (preg_match($reg, $testString, $matches)) {
$multiplier = ($matches['unit']=='km')?1000:1;
$value = str_replace(",",".",$matches[$key]);
$results[] = array('type' => $key, 'value' => $value*$multiplier);
}
}
var_dump($results);