PHP использует preg_match для получения заголовка статьи - PullRequest
1 голос
/ 22 августа 2010

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

preg_match('#(\<title.*?\>)(\n*\r*.+\n*\r*)(\<\/title.*?\>)#', $data, $matches)

Когда я распечатываю массив $ match, я ничего не получаю. Но когда я пытаюсь сделать то же самое в тестере регулярных выражений, он работает нормально. Я даже попытался вставить строку, которая определенно соответствовала бы ей вместо переменной $ data, но безуспешно

Что я здесь не так делаю?

Ответы [ 6 ]

6 голосов
/ 22 августа 2010

Если вы все еще хотите использовать regex, а не DOM, вот что вы можете сделать:

if(preg_match("/<title>(.+)<\/title>/i", $data, $matches))
     print "The title is: $matches[1]";
else
     print "The page doesn't have a title tag";
1 голос
/ 19 июля 2018

Работа для меня:

preg_match("/<title>(.*)<\/title>/is", $html, $matches);

Из этого: https://gist.github.com/jeremiahlee/785770

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

Или вы можете использовать HTML-синтаксический анализатор для HTML:

$dom = new domDocument;
$dom->loadHTML($HTML);

echo $dom->getElementsByTagName('title')->item(0)->nodeValue;
0 голосов
/ 22 августа 2010

Как и все остальные, здесь есть отказ от ответственности "использовать парсер, а не регулярное выражение".Однако, если вы все еще хотите регулярное выражение, посмотрите на это:

$string = "<title>I am a title</title>";
$regex = "!(<title[^>]*>)(.*)(</title>)!i";
preg_match($regex, $string, $matches);
print_r($matches);

//should output:
array(
    [1] => "<title>"
    [2] => "I am a title"
    [3] => "</title>"
)
0 голосов
/ 22 августа 2010

Попробуйте это

if (preg_match('%(<title.*?\b(?!\w))(\n*\r*.+\n*\r*)(\b(?=\w)/title.*?\b(?!\w))%', $data, $matches)) {
    $title = $matches[1];
} else {
    $title = "";
}
0 голосов
/ 22 августа 2010

Возможно, вам понадобится обратная косая черта в кавычках.

Анализатор строк PHP удаляет один слой обратной косой черты, а затем механизм регулярных выражений использует другой слой, поэтому (например) для распознавания обратной косой черты требуется ЧЕТЫих в исходном коде.

Помимо этого, вы можете попробовать воспользоваться преимуществами распознавания XML в PHP или сделать менее умную обработку строк.Обычно, когда ломаются REGEX, это потому, что вы пытаетесь быть слишком умными с ними.Подумайте только о поиске "и удалите весь тег заголовка, а затем удалите пробел из строки и VOILA! A заголовок.

См. Также http://php.net/manual/en/book.simplexml.php

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