2009-01-12 5 views
0

J'ai un CMS avec un éditeur WYSIWYG qui produit un très bon xhtml. Basé sur ce fait, je pense qu'un analyseur HTML pourrait être légèrement exagéré pour ce petit travail.Obtention du contenu des balises XHTML: p, ul et/ou ol de la chaîne

J'ai l'intention d'utiliser des expressions régulières, mais jusqu'ici j'ai été incapable d'obtenir le mien pour correspondre à ce que je suis après.

J'utilise PHP5.

Je dois faire correspondre le contenu des 3 éléments de niveau de bloc que l'éditeur WYSIWYG est capable de produire: p, ul & ol. J'utilise preg_match_all() actuellement.

Quelqu'un peut-il m'aider?

Merci

Répondre

2

Cela devrait fonctionner aussi longtemps que vous n'avez pas emboîtés p/ul/ol tags:

preg_match_all("<(?:p|ul|ol)>(.*?)</(?:p|ul|ol)>", $string, $matches) 

?: empêche tout élément dans les parenthèses d'être inclus dans $matches et .*? empêche la regex de correspondre après la fin d'une autre balise.

+0

Ah je vois ... et sans inclure la parenthèse rend le nettoyant correspondant je suppose. Je vais mettre en œuvre! Merci beaucoup – alex

+0

Je pense que vous aurez besoin de mettre/au début et à la fin de votre regex, et d'échapper à celui de la balise de fermeture ( alex

+0

Mettez # au début et de la regex et vous n'avez pas échapper à /. – PEZ

0

Je crois que je viens tout compris

preg_match_all('/<(p|ul|ol)>(.*)<\/(p|ul|ol)>/iU', $content, $blockElements); 
+0

Oui, ce drapeau/U pour les fonctions preg_ est vraiment neet! – PEZ

0

Cette commande trouvera la plus haute de chaque étiquette tant que vous n'imprimez pas de p tags dans p tags ou ul dans ul. Mais vous pouvez imbriquer p dans ul par exemple. Pour html complexe, vous êtes mieux avec DOM.

données de l'exemple:

$html = <<< EOF 
<p> 
hey 
</p> 

<ul> 
<li> 
    test 
</li> 
<li> 
    <p> 
    df4r4 4f4 
    </p> 
</li> 
</ul> 

<p> 
hoo 
</p> 

EOF; 

Regex:

$regex = '#<(?P<tags>(?i)p|ul|ol)>(?P<values>.*?)</\1>#si'; 
preg_match_all($regex, $html, $output); 

Trier par mots-clés:

for ($i = 0, $t = count($output['tags']); $i < $t; $i++) { 
    $out[$output['tags'][$i]][] = $output['values'][$i]; 
} 

Tags et valeurs séparément, éliminer les doublons avec clé entier et l'ensemble du match de ligne :

$output = array_intersect_key($output, array('tags' => 0, 'values' => 0)); 
Questions connexes