preg_replace : plusieurs fois le même motif

pat29
Invité n'ayant pas de compte PHPfrance

13 mai 2013, 22:56

Bonjour,

y-a-t-il un moyen dans le pattern d'un preg_replace de spécifier le fait que l'on veut plusieurs fois le même motif ?
Par ex. je voudrais écrire en une seule ligne les 2 lignes suivantes:
$html = preg_replace('/<p>(.*?)<\/p>/', '<#p>$1</#p>', $html);
$html = preg_replace('/<li>(.*?)<\/li>/', '<#li>$1</#li>', $html);

Si j'écris cela :
$html = preg_replace('/<(p|li)>(.*?)<\/(p|li)>/', '<#$1>$2</#$1>', $html);
le problème est que ça fonctionne aussi pour le code incorrect suivant
$html = '<p>test</li>'
Je voudrais donc qque chose du genre :
$html = preg_replace('/<(p|li)>(.*?)<\/$1>/', '<#$1>$2</#$1>', $html);

Est-ce possible ?

Merci de votre aide!

Patrick

Mammouth du PHP | 619 Messages

13 mai 2013, 23:30

Bonjour,

a tester
$html = preg_replace('/<(p|\/p|li|\/li)>/', '<#$1>', $html);

pat29
Invité n'ayant pas de compte PHPfrance

14 mai 2013, 00:13

Bonjour,
merci pour ta réponse, mais ça ne fait pas exactement ce que je veux.
Ce que je voudrais c'est que dans le cas où j'ai 2 expressions capturantes, forcer la 2e expression capturante à être identique à la 1ère, c'est-à-dire dans l'exemple ci-dessous, ci j'ai "a" dans la 1ère expression, avoir forcément "a" dans la 2e. Si j'ai "b" dans la 1ère expression avoir forcément b dans la 2e...
$html = preg_replace('/<(a|b|c|d)>(.*?)(\/a|b|c|d)/', '<$1>$2</$1>', $html);
Cela aurait été simple si l'on pouvait utiliser les variables dans le pattern également, du genre
$html = preg_replace('/<(a|b|c|d)>(.*?)$1/', '<$1>$2</$1>', $html);
Mais cela n'étant pas possible comment peut-on procéder ?
Merci de votre aide!

Eléphant du PHP | 170 Messages

14 mai 2013, 04:39

Bonjour,

On ne fera jamais mieux que ce tuto : http://lumadis.be/regex/tuto_pcre.php

Ce que tu cherches à faire se trouve dans le chapitre "Les références arrières (back reference)"

pat29
Invité n'ayant pas de compte PHPfrance

14 mai 2013, 09:34

Bonjour blof,
super, c'est exactement ce que je cherchais!
Merci beaucoup!