Разбор исходного кода веб-страницы с помощью регулярных выражений - PullRequest
0 голосов
/ 24 июля 2011

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

<div id="MustBeInThisId">
   <div class="ValueFromThisClass">
      The Value I need
   </div>
</div>

Как видите, у меня есть упаковочный div с идентификатором. Этот div содержит несколько других div, но только один из тех div, из которых мне нужно значение.

Ответы [ 4 ]

4 голосов
/ 24 июля 2011

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

Вместо этого вам следует использовать анализатор DOM: они созданы именно для этого.


В PHP вы должны использовать класс DOMDocument и его метод DOMDocument::loadHTML() для загрузки содержимого HTML.


Затем вы можете работать с такими методами, как:

Вы даже можете работать с DOMXpathвыполнять запросы XPath к вашему HTML-контенту, что позволит вам искать в нем практически все.


В вашем случае, я полагаю, что-то подобное должно сработать.

Сначала поместите ваш HTML-контент в строку (или используйте DOMDocument::loadHTMLFile()) :

$html = <<<HTML
<p>hello</p>
<div>
    <div id="MustBeInThisId">
    <div class="ValueFromThisClass">
        The Value I need
    </div>
    </div>
<div>
HTML;

Затем загрузите его в DOMDocumentэкземпляр:

$dom = new DOMDocument();
$dom->loadHTML($html);

Instanciate объект DOMXPath и использование его для запроса вашего объекта DOM:
Мое выражение XPath может быть немного более сложным, чем необходимо ... Я не очень хорош с этими ...

$xpath = new DOMXPath($dom);
$items = $xpath->query('//div[@id="MustBeInThisId"]/div[@class="ValueFromThisClass"]');

И, наконец, поработаем с результатами этого запроса:

if ($items->length > 0) {
    var_dump( trim( $items->item(0)->nodeValue ) );
}

И вот ваш результат:

string 'The Value I need' (length=16)
1 голос
/ 24 июля 2011

Используйте что-то вроде simplehtmldom - это сделает вашу жизнь намного, намного проще.

$html = str_get_html($source_code);
$tag = $html->find("#MustBeInThisId .ValueFromThisClass", 0);
$the_value_i_need = $tag->innertext;
0 голосов
/ 24 июля 2011

Или попробуйте библиотеку javascript, например JQuery .Я думаю, что это самый простой способ сделать то, что вы хотите.

0 голосов
/ 24 июля 2011

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

Тогда вы получите хорошие функции, такие как getElementById:)

...