Возникла проблема при сопоставлении HTML-элемента с использованием Preg_Match - PullRequest
1 голос
/ 10 февраля 2010

Я пытаюсь сопоставить HTML-элемент, но не думаю, что он соответствует, так как $ title пуст - может кто-нибудь поправить меня?

Мой preg_match:

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

Пример HTML для соответствия:

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

Я что-то упустил?

Спасибо всем за помощь

Ответы [ 3 ]

1 голос
/ 10 февраля 2010

Как я уже сказал в своем комментарии, регулярное выражение редко, если вообще когда-либо, является подходящим инструментом для анализа html. Я собираюсь использовать пример Zend_Dom_Query, одного из компонентов в Zend Framework, просто потому, что я еще не видел его рекомендованным по одному из этих вопросов. Итак ...

$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;
}
1 голос
/ 10 февраля 2010

Нет ничего для совпадения title="Wat" в теге <a>.

Я бы предложил не использовать регулярное выражение для его анализа. Я не слишком знаком с PHP, но уверен, что в нем уже есть то, что сделает большую часть работы за вас.

0 голосов
/ 10 февраля 2010
$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);
   }
}
...