Возникла проблема с сопоставлением элемента html с использованием Preg_Match

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

Мой 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>

Я что-то упускаю?

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


person Abs    schedule 09.02.2010    source источник
comment
Я не знаю, сколько раз сообщество должно говорить людям... не анализируйте html с помощью регулярных выражений.. используйте SimpleXml, DOMDocument, Zend_Dom_Query, SimpleHtml и т. д. :-)   -  person prodigitalson    schedule 10.02.2010
comment
Я знаю об этом, но это старый скрипт, который нужно исправить, сейчас нет времени его переписывать.   -  person Abs    schedule 10.02.2010


Ответы (2)


В теге <a> нет ничего, что соответствовало бы title="Wat".

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

person Corey    schedule 09.02.2010
comment
Если документ, который вы ищете, является действительным XHTML, вы можете использовать встроенный синтаксический анализатор simpleXML, но во многих случаях это не так. - person Austin Fitzpatrick; 10.02.2010
comment
@Кори - ааа! Спасибо, я даже не заметил этого. О, Боже! Поставил title=\"[^<]*\" - вроде заработало. - person Abs; 10.02.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;
}
person prodigitalson    schedule 10.02.2010