РЕГУЛЯРНОЕ ВЫРАЖЕНИЕ для преобразования любых 3 символов или меньше word в wordVVV
-
21-09-2019 - |
Вопрос
Я пытаюсь преобразовать любое вхождение слова с 3 символами или меньше в то же слово с прикрепленной к нему строкой VVV.
Пример:для -> 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;
Решение
Ваш шаблон неправильно обнаруживает или группирует вещи.
Использование \w
для символов word и стандартных круглых скобок вместо квадратных скобок, и вы не оцениваете PHP-код при замене, вы просто ссылаетесь на захваченные текстовые сегменты, поэтому не нужно e
Отметить:
$pattern = '\b(\w{1,3})\b';
$text = mb_ereg_replace($pattern, '\0VVV', $text, 'm');
В качестве альтернативы используйте preg_replace
с флагом unicode:
$text = preg_replace('/\b\w{1,3}\b/um', '\0VVV', $text)
Если вам нужно использовать арабские символы и символы справа налево, вам нужно использовать свойства символов юникода вместо \w
и \b
(\w
не соответствует буквам со всех языков, и \b
совпадения только между \w\W
и \W\w
- которые оба сломаны wrt.нелатинские языки.)
Попробуйте это сделать:
$text = preg_replace('/(?
(и снова, потому что я не могу сказать, нужно ли мне кодировать < или нет)
$text = preg_replace('/(?<!\PL)(\pL{1,3})(?:\PL)/um', '\1VVV', $text);
Другие советы
Это должно соответствовать тому, что вы хотите?
\b(?<Match>\w{1,3})\b