Comment faire pour extraire les balises d'en-Tête en PHP à partir de la chaîne
À partir d'une chaîne de caractères qui contient beaucoup de HTMl, comment puis-je extraire le texte à partir de <h1><h2>etc
les balises dans une nouvelle variable.
Éventuellement à l'aide de preg_match_all et de l'envoi des matches pour une seule délimité par des virgules variable.
Merci les gars.
OriginalL'auteur bluedaniel | 2010-01-14
Vous devez vous connecter pour publier un commentaire.
Si vous voulez vraiment utiliser les expressions régulières, je pense que:
devrait fonctionner aussi longtemps que vos balises d'en-tête ne sont pas imbriqués. Comme d'autres l'ont dit, si vous n'êtes pas dans le contrôle de l'HTML, les expressions régulières ne sont pas une bonne façon de le faire.
OriginalL'auteur Scott Saunders
Vous devez d'abord nettoyer le code HTML ($html_str dans l'exemple) avec tidy:
Ensuite, vous pouvez charger le XML ($xml_str) dans un DOMDocument:
Et enfin, vous pouvez utiliser Horia Dragomir de la méthode:
Ou vous pouvez aussi les utiliser XPath pour des requêtes plus complexes sur le DOMDocument (voir http://www.php.net/manual/en/class.domxpath.php)
Quelle est l'erreur que vous obtenez? Si j'essaie de l'exemple que vous donnez, il fonctionne comme prévu et imprime "Test"
comme dans l'ensemble de ce code ci-dessus avec le seul changement: $xml_str = tidy_repair_string('<html><body><h1>Test</h1><br></body></html>', $tidy_config); ??? Ça me brise le script, il y a une erreur là c'est de s'écraser comme une faute de frappe ou quelque chose
Je suppose que le 'rangé' module n'est pas activé dans vous êtes en php.ini. Si vous utilisez xampp (ou un autre AMPLI) décommentez la ligne "extension=php_tidy.dll" Si vous utilisez Ubuntu utiliser "apt-get install php5-tidy" pour l'installer et l'activer.
OriginalL'auteur c0deaddict
Lorsque la question est "Comment puis-je extraire des trucs de HTML", la réponse est de ne JAMAIS utiliser les expressions régulières. Au lieu de cela, voir la discussion sur le Robuste, Mature Analyseur HTML pour PHP.
OriginalL'auteur Tony Miller
veuillez également tenir compte de la maternelle
DOMDocument
classe php.Vous pouvez utiliser
$domdoc->getElementsByTagName('h1')
pour obtenir vos en-têtes.OriginalL'auteur Horia Dragomir
Je sais que c'est un super vieux post, mais je voulais parler de la meilleure façon que j'ai été en mesure de saisir collectivement balises d'en-tête.
Cette méthode, qui fonctionne comme une regex, toutefois PHP agit un peu différemment.)
l'utiliser dans vos preg_match
$group[1]
comprendra ce que jamais il est entre la balise d'en-tête.$group[0]
est tout<h1>test</h
Cela permettra de tenir compte des espaces, et si quelqu'un ajoute "class/id"
la classe/id (groupe) est ignoré.
NOTE: Lorsque j'analyse les balises HTML, j'ai toujours la bande et de remplacer tous les espaces, sauts de ligne, tabulations, etc.. avec un 1 espace. Cela minimise multi-lignes, dotalls... Et de très grandes quantités d'espace blanc, qui dans certains cas peut mess avec la regex mise en forme.
Voici un lien vers la page de test regex tester
|<\s*h[1-2](?:.*)>(.*)</\s*h[1-2]>|Ui
sinon il ne sera pas saisir l'ensemble de l'élément et coupe la balise de fermeture> Aussi noter que ce ne corresponde pas si il y a des sauts de ligne (<br/>
) dans l'en-tête qui est tout à fait possible si vous travaillez avec le contenu généré par l'utilisateurOriginalL'auteur timothymarois
Il est recommandé de ne pas utiliser les regex pour ce travail et d'utiliser quelque chose SimpleHTMLDOM analyseur
OriginalL'auteur codaddict
Vous êtes probablement mieux d'utiliser un analyseur HTML. Mais pour vraiment les scénarios simples, quelque chose comme ça pourrait le faire:
preg_match_all(): Unknown modifier 'h'
lors de l'utilisation de cet extrait sur PHP 5.3.5; pour résoudre cette erreur, j'ai remplacé les regex-frontière par un pipe-symbole:'|<h\d>([^<]*)</h\d>|iU'
OriginalL'auteur Emil H
Je veux juste partager ma solution:
Cette fonction retourne un tableau vide si les titres étaient introuvables, ou quelque chose comme ceci:
OriginalL'auteur Andrei Surdu