preg_match_all отрицательный взгляд вперед и отрицательный взгляд сзади - PullRequest
0 голосов
/ 18 января 2019

У меня есть этот шаблон, который начинается с (?<![\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 голосов
/ 18 января 2019

Ваши взгляды стоят рядом с необязательными узорами, -?.Таким образом, всякий раз, когда обходные пути терпят неудачу, происходит возврат и происходит нежелательное совпадение.

Чтобы избежать этого, учитывайте необязательный шаблон внутри шаблонов обхода.

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

См. regex demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...