preg_match часть файла HTML: найдите X и (возможно, X или нет) до конца файла HTML - PullRequest
2 голосов
/ 21 августа 2010

Это сводит меня с ума!Небольшой фрагмент кода, который я не могу отладить :( По сути, у меня есть HTML-файл в строке, и я хочу найти X внутри, пока другой X (то же значение), ЕСЛИ есть другой, если его нет,затем захватите X до конца файла.

Код, который не работает:

$contents = "< div id="main" class="clearfix">    < div id="col-1">< div id="content">< div id="p19601634">< h1>< span id="ppt19601634">";
$regex = "!<div id="content">(.*?)(?:<div id="content">)!s";>
preg_match_all($regex, $contents, $matches);

Обратите внимание, что я добавил пробелы перед DIV для целей отображения и что я хочу проверить с помощьюНОВЫЕ ЛИНИИ и TABS внутри HTML также (в основном, есть строка, возвращающая после первого DIV).

Прямо сейчас, мой код работает, если он находит много случаев моего поиска, и он возвратит поиски. Ноесли найден только один предмет, он не работает.

Кто-нибудь знает это?

Спасибо большое

Ответы [ 2 ]

1 голос
/ 24 августа 2010

Регулярные выражения не являются и никогда не будут подходящим инструментом для этой работы.«Я должен использовать регулярные выражения» не соответствует действительности.Это объясняется теорией информатики: регулярные выражения способны сопоставлять только регулярные языки , но HTML (или XML) является более сложным языком, чем этот.

Помимо вас есть еще одно решениеDOM, упомянутый в ответе @ meder: XSLTProcessor .XSLT - это декларативный язык сопоставления с образцом, такой как регулярные выражения.Но XSLT способен сопоставить иерархическую структуру XHTML или XML.

См. Ответы в Простой синтаксический анализ XML на PHP для получения дополнительных решений, включая пример XSLTProcessor в моем ответе.

Если вы хотите узнать все о методах очистки HTML в PHP, есть книга на эту тему, написанная Мэтью Терландом, под названием php | Руководство архитектора по веб-очистке с помощью PHP .Теперь он доступен в цифровом виде и скоро должен быть в печати. ​​

Если вы на мгновение можете оторваться от PHP, попробуйте пакет под названием Beautiful Soup .Этот пакет имеет одно огромное преимущество: в отличие от парсеров DOM / XSLT, Beautiful Soup не захлебывается, если вы даете указание проанализировать HTML-страницу с плохой разметкой.Поскольку большинство веб-сайтов, которые вы будете просматривать, вероятно, содержат некоторые ошибки, это довольно важное преимущество.

1 голос
/ 21 августа 2010

Используйте библиотеку DOM и сделайте что-то вроде ..

$d = new DOMDocument();
$d->loadHTML($htmlString);
$content = $d->getElementById('content');

$inside = innerHTML( $content );
var_dump($inside);

function innerHTML($node){
  $doc = new DOMDocument();
  foreach ($node->childNodes as $child)
    $doc->appendChild($doc->importNode($child, true));

  return $doc->saveHTML();
}
...