Вот мой код: (Это работает правильно для английского языка)
$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)
Как я могу это исправить?
Вы поместили свое регулярное выражение в класс персонажа в "/[\b(?:دیوار|خوب)\b]/u"
, удалить []
от него:
"/\b(?:دیوار|خوب)\b/u"
Вы могли бы заменить \b
по альтернативе:
"/(?:^|\s)(?:دیوار|خوب)(?:\s|$)/u"
Вы также можете изменить \s
с отрицательным классом символов, который перечисляет арабские буквы. Я не знаю их, но это как: [^دیوارخوب]
…
\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)