PHP 5.6 регулярное выражение неожиданное поведение - PullRequest
0 голосов
/ 25 мая 2018

Я столкнулся со странным поведением в PHP 5.6 (не тестировалось с другими версиями)

var_dump(preg_match('#\b(39||90)\b#', '42')); // int(1)
var_dump(preg_match('#\b(39||90)\b#', '')); // int(0)

https://regex101.com говорит, что шаблон \b(39||90)\b недействителен, но PHP preg_match не возвращает FALSEкак следует, если шаблон недействителен.

Как видите, 42 выдает совпадение, а пустая строка - несоответствие.Я бы ожидал обратного, поскольку || должно означать пустую строку.

Что здесь происходит?

1 Ответ

0 голосов
/ 25 мая 2018

Это регулярное выражение:

\b(39||90)\b

Возвращает успешное совпадение, если найдено какое-либо чередование.Это:

  1. Полное слово 39
  2. Полное слово 90
  3. Граница слова везде на входе (из-запусто ||)

Однако в пустой строке отсутствует граница слова.Граница слова \b утверждается истинной между словом \w и не словом \W.

Например, смотрите эти результаты:

// no word character hence false
var_dump(preg_match('#\b(39||90)\b#', '#@'));
int(0)

# a word char hence true
php > var_dump(preg_match('#\b(39||90)\b#', 'a'));
int(1)

// no word character hence false
php > var_dump(preg_match('#\b(39||90)\b#', "\t\n"));
int(0)
...