2011-02-08 2 views
2

Я работаю с небольшим подмножеством в основном недействительным HTML, и мне нужно извлечь небольшую часть данных. Учитывая тот факт, что большая часть «разметки» недействительна, я не думаю, что загрузка всего в DOM является хорошим вариантом. Более того, для этого простого случая, похоже, много накладных расходов.Какой самый простой способ извлечь часть данных из HTML в PHP?

Вот пример разметки, у меня есть:

(a bunch of invalid markup here with unclosed tags, etc.) 
<TD><span>Something (random text here)</span></TD> 
(a bunch more invalid markup here with more unclosed tags.) 

<TD><span>Something (random text here)</span></TD> часть не повторяется нигде в документе, поэтому я считаю, что просто регулярное выражение будет делать трюк.

Однако, я ужасен с регулярными выражениями.

Должен ли я использовать регулярное выражение? Есть ли более простой способ сделать это? Если возможно, я просто хотел бы извлечь текст после Something, (случайный текст здесь).

Заранее благодарен!

Edit -

Exact пример HTML (я пропущенной материал перед, который является недействительной разметкой, который использует поставщик Это не имеет значение для этого примера, я считаю.):

<div class="FormTable"> 
     <TABLE> 
     <TR> 
       <TD colspan="2">In order to proceed with login operation please 
       answer on the security question below</TD> 
     </TR> 
     <TR> 
       <TD colspan="2">&nbsp;</TD> 
     </TR> 
     <TR> 
       <TD><label class="FormLabel">Security Question</label></TD> 
       <TD><span>What is your city of birth?</span></TD> 
     </TR> 
     <TR> 
       <TD><label class="FormLabel">Answer</label></TD> 
       <TD><INPUT name="securityAnswer" class="input" type="password" value=""></TD> 
     </TR> 
     </TABLE> 
</div> 
+0

возможно дубликат [Лучшие методы для разбора HTML] (HTTP: // StackOverflow. com/questions/3577641/best-methods-to-parse-html) - это [первый вопрос в PHP FAQ btw] (http://stackoverflow.com/questions/tagged/php?sort=faq&pagesize=50) – Gordon

+0

Я думаю, самый большой вопрос был бы - есть ли вложенные '' теги? Если нет, я думаю, что регулярное выражение должно быть прекрасным, если это все, что вы ищете. Не могли бы вы привести пример фактического HTML? –

ответ

2

Если вы уверены, что метки проема открытия и закрытия находятся на одной линии. , ,

$ cat test.php 
<?php 
    $subject = "(a bunch of invalid markup here with unclosed tags, etc.) 
       <TD><span>Something (random text here)</span></TD> 
       (a bunch more invalid markup here with more unclosed tags.)"; 

    $pattern = '/<span>.*<\/span>/'; 

    preg_match($pattern, $subject, $matches); 
    print_r($matches); 

?> 


$ php -f test.php 
Array 
(
    [0] => <span>Something (random text here)</span> 
) 

Если вы не уверены в том, что метки отсчитываются на ту же линию, вы можете рассматривать HTML как текстовый файл, и вычленить информацию тегов пролетов.

$ grep '[</]span>' yourfile.html 
+0

Ничего себе, не понял, что это было так просто. Прекрасно подходит для этого случая. Огромное спасибо. –

1

Вы можете прочитать this answer и другие два, которые он цитирует. Решение недействительно HTML немного за раз на самом деле - это то, чем вы склонны иметь более легкую удачу с использованием регулярных выражений, чем использование полных парсеров.

0

Попробуйте использовать метод DOMDOcument::loadHTML(), он должен подавлять любые ошибки проверки, связанные с HTML.

+0

Хотя я использую DOM для этого, ответ неверен. 'loadHTML' не будет подавлять ошибки проверки. Если вы хотите подавить ошибки синтаксического анализа, вы должны использовать ['libxml_use_internal_errors()'] (http://de3.php.net/manual/en/function.libxml-use-internal-errors.php). – Gordon

1

Использование парсера DOM в вашей ситуации не является оптимальным. Я твердо верю, что вам нужен SAX-парсер, он просто извлекает части вашего документа и отправляет соответствующие события вашим обработчикам. Этот метод позволяет легко разбирать сломанные документы.

Примеры: http://pear.php.net/package/XML_HTMLSax3 http://www.php.net/manual/en/example.xml-structure.php