В настоящее время я пишу библиотеку для соответствия определенным словам в контенте.
По существу, он работает, компилируя слова в регулярные выражения и запуская содержимое через указанные регулярные выражения.
Функция, которую я хочу добавить, указывает, должно ли заданное слово совпадать должно начинаться и/или заканчивать слово. Например, у меня есть слово cat
. Я указываю, что он должен начинать слово, поэтому catering
будет соответствовать, поскольку cat
находится в начале, но ducat
не будет соответствовать, поскольку cat
не запускает слово.
Я хотел сделать это, используя границы слов, но во время некоторого тестирования я обнаружил, что он не работает, как я ожидал бы этого.
Возьмем следующее:
preg_match("/(^|\b)@nimal/i", "[email protected]", $match);
preg_match("/(^|\b)@nimal/i", "[email protected]", $match);
В приведенных выше утверждениях я ожидал бы следующих результатов:
> false
> 1 (@nimal)
Но вместо этого результат противоположный,
> 1 (@nimal)
> false
Во-первых, я ожидаю, что он потерпит неудачу, так как группа будет есть @
, оставив nimal
для соответствия с @nimal
, чего, очевидно, нет. Вместо этого группа соответствует пустой строке, поэтому @nimal
соответствует, что означает, что @
считается частью слова.
Во втором случае я ожидаю, что группа съедет !
, оставив @nimal
, чтобы соответствовать остальным (что должно). Вместо этого он объединяется вместе !
и @
, чтобы сформировать слово, что подтверждается следующим сопоставлением
preg_match("/g\[email protected]\bn/i", "[email protected]", $match);
Любые идеи, почему это делает регулярное выражение?
Мне бы очень понравилась страница, в которой четко указаны границы слов, я просто не могу найти ее для жизни.