preg_match_all否定超前和否定超前

时间:2019-01-18 12:38:16

标签: php regex

我有从(?<![\d.,])(?![\d.,%]| %)结束的模式

为什么匹配16

我希望它不匹配此字符串中的任何内容

$pattern = '/(?<![\d.,])-?\d{1,3}(?:(?:[. ]\d{3})*|\d*)(?:\b|[^.,%]|[,]\d{1,2})-?(?![\d.,%]| %)/';
$value = 'dag 08-16 flex pakke';

echo "pattern: $pattern\nvalue: $value\n";

preg_match_all($pattern, $value, $matches);
print_r($matches);

1 个答案:

答案 0 :(得分:0)

您的环顾四周位于可选模式-?的旁边。因此,每当环视失败时,就会发生回溯,并且会发生不受欢迎的匹配项。

为避免这种情况,请在环视模式内 中考虑可选模式。

/-?(?<![\d.,]-|[\d.,])\d{1,3}(?:(?:[. ]\d{3})*|\d*)(?:\b|[^.,%]|,\d{1,2})(?!-?(?:[\d.,%]| %))-?/
   ^^^^^^^^^^^^^^^^^^^                                                   ^^^^^^^^^^^^^^^^^^^^^

请参见regex demo