Регулярное выражение Php для соответствия отделению

Это - mycode

<?php

/**
 * @author Joomlacoders
 * @copyright 2010
 */
    $url="http://urlchecker.net/html/demo.html";

    $innerHtml=file_get_contents($url);

    //echo $innerHtml;
    preg_match_all("{\<div id='news-id-.*d'\>(.*)\</div\>}",$innerHtml,$matches);

          //<div id='news-id-160346'>            

    var_dump($matches);

?>

Я хочу, находят все содержание в идентификаторе отделения ='news-id-160346'.Пожалуйста, помогите мне!

5
задан skaffman 22 January 2012 в 11:41
поделиться

2 ответа

Использовать парсер HTML. НЕ регулярные выражения.

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

и его закрывающему тегу, нет никакого способа правильно сопоставить этот ввод:

<div id="a">
    <div id="b">
        Foo
    </div>
</div>
<div id="c">
    Bar
</div>

Потому что если ваше регулярное выражение жадное, оно будет соответствовать двум верхним div'ам, а если оно нежадное, оно не будет соответствовать правильному концевому тегу.

Поэтому вы должны использовать парсер HTML. В PHP, DOMDocument::loadHTML или DOMDocument::loadHTMLFile каждый из них делает достаточно хорошую работу. (Вы можете "смело" игнорировать предупреждения, которые они выдают: это всего лишь ошибки разметки, и сгенерированный объект DOMDocument должен быть в полном порядке.)

Поскольку заставить работать PHP getElementById довольно сложно, вы можете использовать DOMXpath для той же цели:

<?php

$url = "http://urlchecker.net/html/demo.html";

$d = new DOMDocument();
$d->loadHTMLFile($url);

$xpath = new DOMXPath($d);
$myNews = $xpath->query('//@id="news-id-160346"')->item(0);

?>
6
ответ дан 14 December 2019 в 13:27
поделиться

Используйте синтаксический анализатор, как предлагали другие.

Или попробуйте следующее регулярное выражение:

preg_match_all("#<div [^>]*id=['\"]news-id-\\d+['\"](.*?)</div>#", $innerHtml, $matches);
print_r($matches);

Проверьте вывод оператора print_r , чтобы понять, почему регулярное выражение не считается правильным инструментом для синтаксического анализа HTML.

0
ответ дан 14 December 2019 в 13:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: