Regexp para converter qualquer 3 chars ou menos palavras em wordvvv
-
21-09-2019 - |
Pergunta
Estou tentando converter qualquer ocorrência de uma palavra com 3 chars ou menos na mesma palavra com a string VVV anexada a ela.
Exemplo: para -> forvvv
Não estou usando nenhum char de latim (UTF8), daí o MB.
O que tenho é:
$pattern='\b[.{1,6}]\b';
$text=mb_ereg_replace($pattern,'\0VVV',$text,'me');
o que estou perdendo?
Aqui está um estudo de caso, veja que não pega nada:
$text="א אב אבי אביהו מדינה שול של";
$pattern='/\b.{1,6}\b/um';
$text=preg_replace($pattern,'hhh',$text);
echo $text;
Solução
Você não está detectando ou agrupando as coisas corretas.
Usar \w
Para caracteres de palavras e parênteses padrão em vez de colchetes, e você não está avaliando o código PHP na substituição, você está simplesmente se referindo a segmentos de texto capturados, então não precisa do e
bandeira:
$pattern = '\b(\w{1,3})\b';
$text = mb_ereg_replace($pattern, '\0VVV', $text, 'm');
Alternativamente, use preg_replace
com a bandeira Unicode:
$text = preg_replace('/\b\w{1,3}\b/um', '\0VVV', $text)
Se você precisar atender a caracteres árabe e da direita para a esquerda, você precisa para nós, unicode, propriedades de personagens em vez de \w
e \b
(\w
não combina cartas de todos os idiomas e \b
apenas corresponde entre \w\W
e \W\w
- que estão quebrados wrt. Idiomas não latinos.)
Experimente isso:
$text = preg_replace('/(?
(e novamente porque não sei dizer se preciso codificar <ou não)
$text = preg_replace('/(?<!\PL)(\pL{1,3})(?:\PL)/um', '\1VVV', $text);
Outras dicas
Isso deve corresponder ao que você quer?
\b(?<Match>\w{1,3})\b