Remplacement d'espaces à l'aide de regex en PHP
-
03-07-2019 - |
Question
Je suis assez nouveau dans les expressions régulières. J'ai l'obligation de remplacer les espaces dans un texte multiligne. Les règles de remplacement sont les suivantes:
- Remplacez tous les espaces en début de ligne par des espaces insécables (
& amp; nbsp;
). - Remplacez toute instance d'espaces répétés (plusieurs espaces ensemble) par le même nombre d'espaces insécables.
- Les espaces simples qui ne sont pas au début de la ligne restent inchangés.
J'ai utilisé le Coach Regex pour créer le motif correspondant:
/( ){2,}|^( )/
Supposons que j'ai ce texte d'entrée:
asdasd asdasd asdas1
asda234 4545 54
34545 345 34534
34 345
À l'aide d'une expression régulière PHP, remplacez une fonction (comme preg_replace ()
), je souhaite obtenir cette sortie:
asdasd asdasd  asdas1
 asda234 4545    54
  34545 345  34534
34 345
Je suis heureux de pouvoir effectuer de simples substitutions de texte à l'aide d'expressions régulières, mais je ne parviens pas à trouver comment remplacer plusieurs fois la correspondance afin d'obtenir le résultat souhaité.
La solution
Je suppose qu'il serait plus facile de trouver chaque espace et de le remplacer. Pour ce faire, utilisez "anticiper". et " regard en retard " groupes.
Ou recherchez un espace ( \ x20
) qui est guidé par ou suivi de tout espace blanc unique ( \ s
); mais ne remplacez que l'espace.
$str = "asdasd asdasd asdas1\n asda234 4545 54\n 34545 345 34534\n34 345\n";
print preg_replace("/(?<=\s)\x20|\x20(?=\s)/", " ", $str);
(J'ai opté pour le numéro 160, car markdown analyse nbsp.)
Résultats en:
asdasd asdasd  asdas1
 asda234 4545    54
  34545 345  34534
34 345
Pour plus d’informations, consultez PCRE et perlre .
répondre aux commentaires
@ Sprogz : Au début, je pensais la même chose. Mais l'exemple montre un "\ n". = > "\ n & amp; nbsp;"
entre les 1ère et 2ème lignes.
Autres conseils
Vous pouvez utiliser le modificateur / e
de PHP pour exécuter du code dans le remplacement, comme ceci:
$str = preg_replace('/( {2,}|^ )/em', 'str_repeat(" ", strlen("\1"))', $str);
J'ai modifié l'expression régulière pour capturer les espaces.
Le modificateur / m
le met en mode multiligne, donc ^
correspond au début de toute ligne.