regex помогите получить содержимое тега в PHP - PullRequest
0 голосов
/ 13 июня 2011

, поэтому у меня есть код

function getTagContent($string, $tagname) {

    $pattern = "/<$tagname.*?>(.*)<\/$tagname>/";
    preg_match($pattern, $string, $matches);


    print_r($matches);

}

, а затем я звоню

$url = "http://www.freakonomics.com/2008/09/24/wall-street-jokes-please/";
$html = file_get_contents($url);
getTagContent($html,"title");

, но тогда это показывает, что совпадений нет, а если вы откроете источник URL тамявно существует тег заголовка ....

что я сделал не так?

Ответы [ 4 ]

2 голосов
/ 13 июня 2011

попробуйте DOM

$url  = "http://www.freakonomics.com/2008/09/24/wall-street-jokes-please/";
$doc  = new DOMDocument();
$dom  = $doc->loadHTMLFile($url);
$items = $doc->getElementsByTagName('title');
for ($i = 0; $i < $items->length; $i++)
{
  echo $items->item($i)->nodeValue . "\n";
}
0 голосов
/ 13 июня 2011

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

$pattern = "/<$tagname.*?>(.*)<\/$tagname>/s";
0 голосов
/ 13 июня 2011

Ваша php-функция getTagContent выглядит следующим образом:

function getTagContent($string, $tagname) {
    $pattern = '/<'.$tagname.'[^>]*>(.*?)<\/'.$tagname.'>/is';
    preg_match($pattern, $string, $matches);
    print_r($matches);
}

важно использовать не жадное совпадение всех .*? для сопоставления текста между началом и концом тегаи не менее важно использовать флаги s для DOTALL (также совпадают с новой строкой) и i для игнорирования сравнения регистра.

0 голосов
/ 13 июня 2011

Тег 'title' находится не на той же строке, что и закрывающий тег, поэтому ваш preg_match не находит его.

В Perl вы можете добавить ключ / s, чтобы он отбрасывал весь ввод, как если бы он был в одной строке: я забываю, позволит ли preg_match сделать это или нет.

Но это только одна из причин, по которой синтаксический анализ XML и вариантов с помощью регулярного выражения является плохой идеей.

...