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é.

Était-ce utile?

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)/", "&#160;", $str);

(J'ai opté pour le numéro 160, car markdown analyse nbsp.)

Résultats en:

asdasd asdasd&#160;&#160;asdas1
&#160;asda234 4545&#160;&#160;&#160;&#160;54
&#160;&#160;34545 345&#160;&#160;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("&nbsp;", 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top