在正则表达式中直接操作正则表达式匹配

时间:2011-08-26 08:24:18

标签: php regex

我在数组中有几个正则表达式并测试一些字符串。

$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代码中添加异常。

感谢您的帮助! :)

沃尔夫

4 个答案:

答案 0 :(得分:2)

如果你想要肮脏的技巧,你可以在分配字符串之后做这样的事情:

$testString = preg_replace('/(\d+)(?:,(\d+))?(\s*)km\b/e', '($1.$2 * 1000)."$3m"', $testString);

http://ideone.com/Sk2um

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)。然后使用类似

之类的值将值转换为float
$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);