web-dev-qa-db-fra.com

Faire correspondre un modèle à plusieurs lignes via PHP preg_match ()

Comment puis-je faire correspondre subject via un modèle d'expression régulière PHP preg_match () dans ce code HTML:

      <table border=0>
  <tr>
  <td>


  <h2>subject</h2>



    </td>

Tous les espaces blancs et les nouvelles lignes sont laissés exprès. Le problème réside donc dans l'extraction du nom du sujet à l'aide d'un modèle de lignes multiples.

28
Dmitriy Ryabinin

Si vous recherchez (par exemple) un h2 balise imbriquée dans une balise td où il n'y a que des espaces entre les deux, utilisez simplement \s qui inclut les espaces, les nouvelles lignes, etc. par exemple ::

preg_match('#<td>\s*<h2>(.*?)</h2>\s*</td>#i',$str,$matches);
// result is in $matches[1]

Voyez-le en action ici .

Pour votre intérêt, ici est une liste de différents modificateurs que vous pouvez transmettre à preg_* les fonctions. Les drapeaux qui peuvent vous intéresser sont:

  • s ("dotall"): celui-ci fait . correspond à chaque caractère, y compris sauts de ligne. Alors, dites votre <h2>.....</h2> était réparti sur plusieurs lignes. Ensuite, il faudrait faire

    preg_match('#<td>\s*<h2>(.*?)</h2>\s*</td>#is',$str,$matches);
    

    afin d'avoir le .* parcourir plusieurs lignes (voir le s supplémentaire à la fin de l'expression régulière?).

  • m ("multiligne"): celui-ci laisse simplement ^ et $ correspond au début/fin de la ligne au lieu du début/fin de la chaîne . Vous n'en avez vraiment besoin que si vous utilisez ^ et $ dans votre modèle et souhaitez qu'ils correspondent au début/à la fin de chaque ligne individuelle dans votre entrée.
55
mathematical.coffee

Vous pouvez ajouter l'opérateur m à votre expression régulière:

// Given your HTML content.
$html = 'Your HTML content';
preg_match('/<td[^>]*>(.*?)<\/td>/im', $html, $matches);

J'espère que cela (encore) aide, hahaha.

13
Saul Martínez

Très simplement avec

preg_match('/<h2>(.*?)<\\/h2>/', $str, $matches);
print($matches[1]);

Le format multiligne n'a aucun effet sur l'expression régulière, sauf si vous devez faire correspondre une chaîne qui s'étend sur plusieurs lignes.

3
Borodin

Vous ne devez pas utiliser l'expression régulière pour analyser le contenu HTML. Cela peut entraîner de nombreux problèmes si vous ne pouvez pas contrôler ce que l'utilisateur peut saisir. Il y a beaucoup de meilleures solutions dans toutes les langues. Dans la plupart des cas, un analyseur XML fait un meilleur travail. Découvrez DOMDocument , simplehtmldom ou php-html-parser

Voir ici pour plus de réponses pourquoi vous ne devriez pas utiliser l'expression régulière sur le contenu HTML: les balises ouvertes RegEx correspondent à l'exception des balises autonomes XHTML

1
Maciej Paprocki