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