2010-05-26 7 views
1

Je suis en train d'utiliser une expression régulière comme ci-dessous:expression régulière rupture sur une nouvelle ligne

preg_match_all('|<table.*</table>|',$html,$matches, PREG_SET_ORDER); 

Mais cela ne fonctionne pas, et je pense que le problème est la nouvelle ligne dans la chaîne $html.
Quelqu'un pourrait me dire un travail autour?


EDIT: J'ai réalisé qu'il n'est pas correct d'utiliser regex pour analyser HTML. Merci à ceux qui m'ont dit. :)

+4

modificateur 'de s', mais vous ne devriez pas utiliser regex pour analyser html – SilentGhost

+0

Quelqu'un est l'analyse html avec Regex. .. vous savez quoi faire –

+0

@SilentGhost thanx. Pourriez-vous me dire quel est le problème avec l'analyse de html avec regex? – shyam

Répondre

1
preg_match_all('|<table.*?</table>|ms',$html,$matches, PREG_SET_ORDER); 
3

Avant de prendre une décision sur ce qu'il faut faire ensuite, je l'avais lu cette première: http://www.codinghorror.com/blog/2009/11/parsing-html-the-cthulhu-way.html

En général, ce n'est pas une bonne idée d'analyser avec RegEx html.

Je recommande d'utiliser DOM

Vous pouvez consulter la PHP Simple HTML DOM Parser comme alternative.

Caractéristiques principales:

  • Un analyseur HTML DOM écrit en PHP5 + vous permettent de manipuler HTML d'une manière très facile!
  • Nécessite PHP 5+.
  • Prend en charge le code HTML non valide.
  • Trouver des balises sur une page HTML avec des sélecteurs comme jQuery.
  • Extrait le contenu de HTML sur une seule ligne.
1

Avez-vous essayé le modificateur multiligne m?

preg_match_all('|<table.*</table>|m',$html,$matches, PREG_SET_ORDER); 
3

Le point ne correspond pas à moins que le retour à la ligne s pattern modifier est utilisé. (Sachez que l'utilisation de regex pour analyser les classements HTML parmi les pires capitaux capitaux ici dans SO).

0

Utilisez le drapeau/s pour avoir le '.' s'applique également aux nouveaux caractères de ligne, ou vérifie simplement les nouveaux caractères de ligne explicitement - habituellement '[\ n \ r]'. Je ne l'ai pas encore lu moi-même, mais consultez plus d'informations sur la bibliothèque PCRE au http://www.pcre.org/pcre.txt

Attention cependant à la façon dont vous formez votre modèle - les longues chaînes d'entrée avec des retours à la ligne mélangés à des motifs mal compris peuvent provoquer des échecs de script inexpliqués et des réinitialisations de connexion .

Dans votre cas, les fonctions PCRE ne semblent pas être nécessaires ici et peuvent de toute façon provoquer des résultats inattendus. Si vous êtes à la recherche d'extraire le contenu d'une seule table sur une page, pourquoi ne pas le faire les plus élémentaires ...

 
$start = stripos($input, "<table>"); 
$end = stripos($input, "</table>", $start); 
$my_table = substr($input, $start, $end); 
0

EDIT: Je me suis rendu compte que ce n'est pas le droit d'utiliser regex analyser le HTML.

Mieux: Vous pouvez lire $html dans un objet SimpleXML et analyser avec SimpleXML de Xpath. (Puissant et beaucoup plus facile à utiliser que l'extension DOM à mon humble avis.)

Comme ceci:

$html = "<html><body><table id=\"mytbl\"><tr><td>ABC</td></tr><tr><td>DEF</td></tr></table></body></html>"; 

$xml = simplexml_load_string($html); 

if($xml) 
foreach($xml->xpath("/html/body/*") as $item) { 
    echo $item["id"] . "<br>"; // mytbl 
    foreach($item->tr as $tr) { 
     echo $tr->td . "<br>"; // 1:ABC, 2:DEF 
    } 
} 
Questions connexes