Невозможно использовать регулярные выражения для поиска в PHP? - PullRequest
0 голосов
/ 06 сентября 2010

Я пытаюсь получить код HTML-документа в определенных тегах.

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

Вот мой код:

<html>
<head></head>
<body>
<?php 
     $url = "http://sf.backpage.com/MusicInstruction/";   
     $data = file_get_contents($url);
     $pattern = "/<div class=\"cat\">(.*)<\/div>/";
     preg_match_all($pattern, $data, $adsLinks, PREG_SET_ORDER);
     var_dump($adsLinks);
     foreach ($adsLinks as $i) {
         echo "<div class='ads'>".$i[0]."</div>";
     } 

?>
</body>
</html>

Приведенный выше код не работает, но он работает, когда я изменяю шаблон $ на:

$pattern = "/<div class=\"date\">(.*)<\/div>/";

или

$pattern = "/<div class=\"sponsorBoxPlusImages\">(.*)<\/div>/";

Я не вижу различия между этими $ pattern. Пожалуйста, помогите мне найти ошибку. Спасибо.

Ответы [ 2 ]

4 голосов
/ 06 сентября 2010

Используйте PHP DOM для анализа HTML вместо регулярного выражения.

Например, в вашем случае (код обновлен для отображения HTML) :

$doc = new DOMDocument();
@$doc->loadHTML(file_get_contents("http://sf.backpage.com/MusicInstruction/"));
$nodes = $doc->getElementsByTagName('div');

for ($i = 0; $i < $nodes->length; $i ++)
{
    $x = $nodes->item($i);

    if($x->getAttribute('class') == 'cat');
        echo htmlspecialchars($x->nodeValue) . "<hr/>"; //this is the element that you want
}
2 голосов
/ 06 сентября 2010

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

$pattern = "/<div class=\"cat\">(.*)<\/div>/s";

Когда вы сделаете это, шаблон может оказаться слишком жадным, поскольку он попытается захватить все до последнего закрывающего элемента div. Чтобы сделать его нежадным и просто сопоставить следующий закрывающий элемент div, добавьте? после *

$pattern = "/<div class=\"cat\">(.*?)<\/div>/s";

Это просто иллюстрирует, что для всех, кроме самых простых случаев, анализ HTML с помощью регулярных выражений - это путь к безумию. Поэтому попробуйте использовать функции DOM для анализа HTML.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...