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;
Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top