Почему \ b не работает правильно для некоторых языков?

Вот мой код: (Это работает правильно для английского языка)

$str1 = "itt is a testt";
$str2 = "it is a testt";
$str3 = "itt is a test";
$str4 = "it is a test";

echo preg_match("[\b(?:it|test)\b]", $str1) ? 1 : 2; // output: 2 (do not match)
$str2           // output: 1 (it matches)
$str3           // output: 1 (it matches)
$str4           // output: 1 (it matches)

Но я не знаю почему, выше REGEX не работает правильно для персидского языка 🙁 всегда возвращает 1)

$str1 = "دیوار";
$str2 = "دیوارر";

echo preg_match("/[\b(?:دیوار|خوب)\b]/u", $str1) ? 1 : 2; // output: 1
echo preg_match("/[\b(?:دیوار|خوب)\b]/u", $str2) ? 1 : 2; // output: 1 (it should be 2)

Как я могу это исправить?

4

Решение

Вы поместили свое регулярное выражение в класс персонажа в "/[\b(?:دیوار|خوب)\b]/u", удалить [] от него:

"/\b(?:دیوار|خوب)\b/u"

Вы могли бы заменить \b по альтернативе:

"/(?:^|\s)(?:دیوار|خوب)(?:\s|$)/u"

Вы также можете изменить \s с отрицательным классом символов, который перечисляет арабские буквы. Я не знаю их, но это как: [^دیوارخوب]

4

Другие решения

\b внутри класса символов или внутри регулярных выражений в двойных кавычках является возврат на одну позицию персонаж.

Вот почему правильный ответ: либо используйте регулярное выражение в одинарных кавычках, чтобы не использовать двойное экранирование, либо используйте двойную обратную косую черту перед b внутри регулярных выражений в двойных кавычках.

  • '/\b(?:دیوار|خوب)\b/u' или же…
  • "/\\b(?:دیوار|خوب)\\b/u"

Видеть это IDEONE демо:

echo preg_match('/\b(?:دیوار|خوب)\b/u', $str1) ? 1 : 2; // output: 1
echo preg_match('/\b(?:دیوار|خوب)\b/u', $str2) ? 1 : 2; // output: 1 (it should be 2)
1

По вопросам рекламы [email protected]