2009-12-02 5 views
0

cela devrait être facile, mais je ne peux en quelque sorte pas le comprendre: Je extrait de code HTML comme celui-ci: <p style="padding:0 10 20 30; margin: 1 2 3 4 ">This is 201 some 20 text 1 <b>30</b> with some numbers 30 20</p> ...regex - correspond pas dans la balise

je dois correspondre les numéros 1, 20, 30 (uniquement ceux-ci) et les remplacer par des liens. Évidemment, je ne veux pas remplacer les numéros à l'intérieur balise

La sortie doit être: <p style="padding:0 10 20 30; margin: 1 2 3 4 ">This is 201 some <a href="#20">20</a> text <a href="#1">1</a> <b><a href="#30">30</a></b> with some numbers <a href="#30">30</a> <a href="#20">20</a></p> ...

C'est ce que j'ai:

$text = '<p style="padding:0 10 20 30; margin: 1 2 3 4 ">This is 201 some 20 text 1 <b>30</b> with some numbers 30 20</p> ...'; 

$pat[] = '/(?<=\>)([^<]*)([^0-9\:])(1|20|30)([^0-9])/s'; 
$repl[] = '$1$2<a href="#$3" class="p2">$3</a>$4'; 
echo preg_replace($pat, $repl, $text); 

Il fonctionne, mais elle correspond à un seul numéro à la fois , et je ne veux pas l'exécuter en boucle.

Des idées?

-

Je vois le point d'utiliser l'analyseur HTML, mais il semble que quelque chose qui peut être fait avec regexp. Surtout quand il n'y a pas de bibliothèque standard pour analyser HTML en PHP, et je ne suis pas sûr si je veux importer l'analyseur HTML tiers juste pour cette tâche. Une tentative de réparer mon regex?

- J'ai réussi à écrire regexp qui fonctionne dans mon cas. Si quelqu'un est intéressé:

$pat[] = '/>(([^<]*)(([^0-9\:]))|())(1|20|30)(?(?=[<]+?)(?!<\/a>)|(([^0-9\<])([^<]*)<(?!\/a>)))/sU'; $repl[] = '>$1<a href="#$6" class="p22">$6</a>$7';

Je sais très bien qu'il peut être facilement accompli avec l'analyseur HTML, mais je ne veux pas inclure parseurs tiers dans mon logiciel.

Cordialement, Philia

Répondre

1

C'est très simple: extraire uniquement le texte avec un analyseur HTML, puis utiliser des expressions régulières sur ce point.

0

HTML ne devrait pas être analysé avec regex parce que ce n'est pas une langue régulière. Vous pourriez être en mesure de le faire pour former correctement XHTML, mais je ne le recommanderais pas. Voir the most voted up answer on SO

Questions connexes