2011-08-19 2 views
1

Je suis en train d'y réfléchir depuis un moment.PHP Supprimer toutes les balises de paragraphe à l'intérieur des balises d'en-tête

J'ai cette chaîne (il y a plus de contenu avant et après les balises h2):

...<h2 style='line-height: 44px;'><p>Lorem Ipsum</p></h2>... 

Que regex dois-je utiliser pour supprimer tous les < p> et </p> balises dans ces balises d'en-tête ?

Je suis en train de faire quelque chose comme ça, mais le lookbehind positif on ne travaille pas:

// for the starting <p> tag 
$str = preg_replace('/(?<=<h[1-6]{1}[^>]+>)\s*<p>/i', '', $str); 
// for the ending </p> tag 
$str = preg_replace('/<\/p>\s*(?=<\/h[1-6]{1}>\s*)/i', '', $str); 

Cela ne prend pas les balises de compte de paragraphe profond à l'intérieur du texte dans les < h2> tag également

[Mise à jour]

Ceci est dérivé de l'un des liens suggérés PeeHaa

// for the starting <p> tag 
$str = preg_replace("#(<h[1-6].*?>)<p.*?>#", '$1', $str); 
// for the ending </p> tag 
$str = preg_replace("#<\/p>(<\/h[1-6]>)#", '$1', $str); 
+3

_Don't_ utiliser une expression régulière, pour faire face à HTML. Utilisez un analyseur, comme DOM, pour cela. – KingCrunch

+0

Oui, je sais que DOM est idéal mais pour cette instance, je n'ai pas le choix de le faire en PHP. De plus, les balises de paragraphes ici sont ajoutées automatiquement (WordPress) donc elles apparaissent toujours comme ceci et j'ai besoin de les enlever. –

+0

PHP connaît DOM (et d'autres XML-analyseurs) aussi;) – KingCrunch

Répondre

2

Vous ne devriez pas essayer Parse html avec regexes, bien qu'ayant dit que, puisque c'est un sous-ensemble de HTML et non un document/Mise en forme imbriqué, il est possible:

preg_replace('/(<h([1-6])[^>]*>)\s?<p>(.*)?<\/p>\s?(<\/h\2>)/', "$1$3$4") 

cas de test ici:

http://codepad.org/oA2rtNP9

+0

Mieux. +1 pour le cas de test et pour l'obtenir en 1 ligne.Exactement ce dont j'ai besoin. –

1

PHP Parse HTML code

Parse Website for URLs

php - parse html page

Et beaucoup, beaucoup d'autres (je aurait pu ajouter 100+ plus).

Fondamentalement, la chose est:

Ne pas essayer d'analyser HTML en utilisant regex. HTML n'est pas une langue régulière.

Utilisez un analyseur HTML pour cela.

Par exemple: http://php.net/manual/en/book.dom.php

+0

Oui, je le sais mais pour cette instance, je n'ai pas le choix de le faire en PHP. De plus, les balises de paragraphes ici sont ajoutées automatiquement (WordPress) donc elles apparaissent toujours comme ceci et j'ai besoin de les enlever. –

+0

@Jami: drôle. c'est ce qu'ils disent tous :) Bien sûr, utilisez regex et attendez que la chose vous morde dans le cul. :) – PeeHaa

+0

Les sous-ensembles de code html/non-imbriqué peuvent être partiellement analysés avec des regexes. Bien que ce soit généralement faux, oui: p – sg3s

Questions connexes