REGEX convertir les 3 caractères ou moins mot à mot V
-
21-09-2019 - |
Question
Je suis en train de convertir toute occurrence d'un mot avec 3 caractères ou moins au même mot avec le VVV string attaché.
Exemple: pour -> forVVV
J'utilise aucun caractères latins (UTF8), d'où le MB.
Ce que j'est:
$pattern='\b[.{1,6}]\b';
$text=mb_ereg_replace($pattern,'\0VVV',$text,'me');
Qu'est-ce que je suis absent?
Voici une étude de cas, voir les captures rien:
$text="א אב אבי אביהו מדינה שול של";
$pattern='/\b.{1,6}\b/um';
$text=preg_replace($pattern,'hhh',$text);
echo $text;
La solution
Vous êtes modèle ne détecte pas ou regroupement choses.
Utilisez \w
pour mot-caractères et entre parenthèses standard au lieu de crochets, et vous n'êtes pas évaluer du code PHP dans le remplacement, vous êtes tout simplement référence à des segments de texte capturés, ne doivent donc pas le drapeau e
:
$pattern = '\b(\w{1,3})\b';
$text = mb_ereg_replace($pattern, '\0VVV', $text, 'm');
Vous pouvez également utiliser preg_replace
avec le drapeau unicode:
$text = preg_replace('/\b\w{1,3}\b/um', '\0VVV', $text)
Si vous avez besoin pour répondre à l'arabe et de droite à gauche personnages, vous avez besoin de propriétés de caractère unicode au lieu de \w
et \b
(\w
ne correspond pas à des lettres de toutes les langues, et \b
correspond seulement entre \w\W
et \W\w
- qui sont tous deux WRT cassé. langues non latines.)
Essayer cette 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);
Autres conseils
Cela devrait correspondre à ce que vous voulez?
\b(?<Match>\w{1,3})\b