REGEXP, чтобы преобразовать любые 3 символа или меньше слова в wordVVV

Я пытаюсь преобразовать любое вхождение слова с 3 или менее символами в одно и то же слово с прикрепленной к нему строкой VVV.
Пример: for -> forVVV
Я не использую латинские символы (UTF8), следовательно, MB.
Что у меня есть:

$pattern='\b[.{1,6}]\b';
$text=mb_ereg_replace($pattern,'\0VVV',$text,'me');

Что мне не хватает?

Вот пример, видите, ничего не ловит:

$text="א אב אבי אביהו מדינה שול של";
$pattern='/\b.{1,6}\b/um';
$text=preg_replace($pattern,'hhh',$text);
echo $text;

2 ответа

Решение

Ваш шаблон не обнаруживает или группирует вещи правильно.

использование \w для символов слова и стандартных скобок вместо квадратных скобок, и вы не оцениваете PHP-код при замене, вы просто ссылаетесь на захваченные текстовые сегменты, поэтому вам не нужны e флаг:

$pattern = '\b(\w{1,3})\b';
$text = mb_ereg_replace($pattern, '\0VVV', $text, 'm');

В качестве альтернативы используйте preg_replace с флагом Юникода:

$text = preg_replace('/\b\w{1,3}\b/um', '\0VVV', $text)

Если вам нужно обрабатывать арабские символы и символы справа налево, вам нужно использовать свойства символов Юникода вместо \w а также \b (\w не совпадают буквы на всех языках, и \b только совпадения между \w\W а также \W\w - которые оба сломаны по отношению к нелатинские языки.)

Попробуйте это intead:

$text = preg_replace('/(?

(and again cos I can't tell whether I need to encode < or not)

$text = preg_replace('/(?<!\PL)(\pL{1,3})(?:\PL)/um', '\1VVV', $text);

Это должно соответствовать тому, что вы хотите?

\b(?<Match>\w{1,3})\b
Другие вопросы по тегам