РЕГУЛЯРНОЕ ВЫРАЖЕНИЕ для преобразования любых 3 символов или меньше word в wordVVV

StackOverflow https://stackoverflow.com/questions/1373753

  •  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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top