2010-12-03 44 views
0

Je suis désespéré à la recherche de la solution pour obtenir cette chaîne de textePHP -> preg_match_all pour la structure suivante <h6> mon titre</h6> texte ... <h6> autre titre</h6> plus de texte

<h6>First pane</h6> 
... pane content ... 
<h6>Second pane</h6> 
Hi, this is a comment. 
To delete a comment, just log in and view the post's comments. 
There you will have the option to edit 
or delete them. 
<h6>Last pane</h6> 
... last pane content ... 

analysée en un tableau PHP .

J'ai besoin de séparer à

1. 
1.0=> First pane 
1.1=> ... pane content ... 

2. 
2.0=> Second pane 
2.1=> Hi, this is a comment. 
    To delete a comment, just log in and view the post's comments. 
    There you will have the option to edit 
    or delete them. 

3. 
3.0=> Last pane 
3.1=> ... last pane content ... 
+1

* (lié) * [Meilleures méthodes pour analyser HTML] (http://stackoverflow.com/questions/3577641/best-methods-to-parse-html/3577662#3577662) – Gordon

Répondre

1

Votre regex devrait ressembler à ceci:

/<h6>([^<]+)<\/h6>([^<]+)/im 

Si vous exécutez le script suivant, vous verrez que les valeurs que vous recherchez sont dans $ matches [1] et $ matches [2].

$s = "<h6>First pane</h6> 
... pane content ... 
<h6>Second pane</h6> 
Hi, this is a comment. 
To delete a comment, just log in and view the post's comments. 
There you will have the option to edit 
or delete them. 
<h6>Last pane</h6> 
... last pane content .."; 
$r = "/<h6>([^<]+)<\/h6>([^<]+)/im"; 

$matches = array(); 
preg_match_all($r,$s,$matches); 

print_r($matches); 
+0

Merci. Cela fonctionne presque. Je manque juste le contenu réel dans mon exemple je l'ai appelé 1.1, 2.1 et 3.1. Une idée de comment je peux obtenir ça ...? – chris

+0

Salut, je suis désolé que votre code fonctionne. J'ai copié le contenu de la variable $ s et cela a fonctionné .... Unfortunaly j'ai vérifié l'entrée de mon $ s et il semble que ce

volet Première

… contenu du volet …

volet Deuxième

Salut, ceci est un commentaire.
Pour supprimer un commentaire, il suffit de vous connecter et de voir les commentaires post ’ s.
Là, vous aurez la possibilité d'éditer
ou de les supprimer.

Dernier volet

… contenu du dernier volet …
Vous avez une idée de comment cela fonctionne? – chris

+0

Quelque chose de plus complexe que votre résultat initial et vous ne devriez pas vraiment utiliser une expression régulière et utiliser à la place un analyseur DOM. – 01001111

1

Vous ne devriez pas essayer d'analyser HTML avec une regex. Ceci est condamné à causer beaucoup de peine et de tristesse à tous, sauf au HTML le plus simple, et se casse instantanément si quelque chose change dans votre structure de document. Utilisez un bon HTML ou analyseur DOM à la place, comme de php DOMDocumenthttp://php.net/manual/en/class.domdocument.php

Par exemple, vous pouvez utiliser getElementsByTagName http://www.php.net/manual/en/domdocument.getelementsbytagname.php pour obtenir je crois que tous l »

+0

Merci pour le conseil. J'ai utilisé cette classe pour des trucs plus avancés, mais dans ce cas j'ai vraiment juste besoin d'analyser l'exemple ci-dessus ...et si ce n'était que le

je voulais avoir, que ce serait assez facile, je ne parviens pas à obtenir à la fois le titre et le contenu ci-dessous .. – chris

+0

Je conseillerais encore d'utiliser cela. Ce n'est pas beaucoup plus de code à écrire, et je n'ai pas testé la regex publiée par 01001111, mais il semblerait qu'elle se casse si vous avez un "<" dans votre texte. –

+0

Je suppose que vous avez raison; Merci mec! – chris

0

h6 le drapeau PREG_SET_ORDER est ce que vous cherchez.

$regex = '~<h6>([^<]+)</h6>\s*([^<]+)~i'; 

preg_match_all($regex, $source, $matches, PREG_SET_ORDER); 

De cette façon, chaque élément dans le $ à tableau est un tableau contenant le match global suivi par tous du groupe capture pour une seule tentative de match. Le résultat au premier match de ressemble à ceci:

Array 
(
    [0] => Array 
     (
      [0] => First pane 
... pane content ... 

      [1] => First pane 
      [2] => ... pane content ... 

     )

see it in action on ideone

EDIT: Notez que le \s*-je, aussi. Sans cela, le contenu correspondant démarre toujours sans séparateur de ligne.