2010-02-09 8 views
1

J'essaie de faire correspondre un élément html mais je ne pense pas que son appariement depuis $ titles est vide - quelqu'un peut-il me corriger?Avoir un problème de correspondance avec un élément html en utilisant Preg_Match

Mon preg_match:

preg_match_all("~<td align=\"left\" width=\"50%\">[^<]*. <b><a href=\"(.*?)\">[^<]*</a>~i", $main, $titles); 

Exemple HTML pour correspondre:

//<td align="left" width="50%">1. <b><a title="Wat" href="http://www.exmple.com/q.html">Wat</a></b><br></td> 

Est-ce que je manque quelque chose?

Merci à tous pour toute aide

+3

Je ne sais pas combien de fois la communauté de dire aux gens ... Do not parse html avec une expression régulière .. utiliser SimpleXML, DOMDocument, Zend_Dom_Query, SimpleHtml, etc ..: - – prodigitalson

+0

Je suis conscient de cela, mais c'est un vieux script qui doit être corrigé, pas le temps de le réécrire maintenant. – Abs

Répondre

1

Il n'y a rien à correspondre title="Wat" dans la balise <a>.

Je suggère de ne pas utiliser une regex pour l'analyser. Je ne suis pas trop familier avec PHP mais je suis sûr qu'il a déjà quelque chose qui fera la plupart du travail pour vous.

+1

Si le document que vous recherchez est XHTML valide, vous pouvez utiliser l'analyseur simpleXML intégré, mais plusieurs fois ce n'est pas le cas. –

+0

@Corey - aaah! Merci, je n'ai même pas remarqué ça. Cher Dieu! Mettre 'title = \" [^ <] * \ "' - semble fonctionner. – Abs

1

Comme je l'ai dit dans mon commentaire regex est rarement, voire jamais, l'outil approprié à utiliser pour analyser html. Je vais utiliser un exemple de Zend_Dom_Query, l'un des ecomponetns de Zend Framework simplement parce que je ne l'ai pas encore vu recommandé sur l'une de ces questions. Alors ...

$dom = new Zend_Dom_Query($htmlHaystack); 
$anchors = $dom->query('//td/a[@title]'); // xpath here 
if(count($anchors) > 0) 
{ 
    $titles = array(); 
    foreach($anchors as $element) 
    { 
    $titles[] = $element->getAttribute('title'); 
    } 
} 
else 
{ 
    $title = null; 
} 
0
$string='<td align="left" width="50%">1. <b><a title="Wat" href="http://www.exmple.com/q.html">Wat</a></b><br></td>'; 
$s = explode("</a>",$string); 
foreach($s as $k){ 
    if (strpos($k,"href")!==FALSE){ 
     echo preg_replace('/.*href="|">.*/ms',"",$k); 
    } 
} 
Questions connexes