RegEx, чтобы получить ключевые слова из HTML - PullRequest
1 голос
/ 15 ноября 2009

Я пытаюсь получить ключевые слова со страницы HTML, которую я очищаю с помощью PHP.

Итак, если тэг ключевых слов выглядит так:

<meta name="Keywords" content="MacUpdate, Mac Software, Macintosh Software, Mac Games, Macintosh Games, Apple, Macintosh, Software, iphone, ipod, Games, Demos, Shareware, Freeware, MP3, audio, sound, macster, napster, macintel, universal binary">

Я хочу получить это обратно:

MacUpdate, Mac Software, Macintosh Software, Mac Games, Macintosh Games, Apple, Macintosh, Software, iphone, ipod, Games, Demos, Shareware, Freeware, MP3, audio, sound, macster, napster, macintel, universal binary

Я построил регулярное выражение, но это не сработало.

(?i)^(<meta name=\"keywords\" content=\"(.*)\">)

Есть идеи?

Ответы [ 7 ]

3 голосов
/ 15 ноября 2009

Я бы использовал парсер HTML / XML, такой как DOMDocument и XPath для извлечения узлов из DOM:

$doc = new DOMDocument();
$doc->loadHTML($html);
$xpath = new DOMXPath($doc);
$keywords = $xpath->query('//meta[translate(normalize-space(@name), "KEYWORDS", "keywords")="keywords"]/@content');
foreach ($keywords as $keyword) {
    echo $keyword->value;
}

Функция translate представляется необходимой, поскольку PHP-реализация XPath не знает функцию lower-case .

Или вы выполняете фильтрацию с помощью PHP:

$metas = $xpath->query('//meta');
foreach ($metas as $meta) {
    if ($meta->hasAttribute("name") && trim(strtolower($meta->getAttribute("name")))=='keywords' && $meta->hasAttribute("content")) {
        echo $meta->getAttribute("content")->value;
    }
}
2 голосов
/ 07 ноября 2012

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

Если вы программируете на PHP, ознакомьтесь с http://simplehtmldom.sourceforge.net/ - SimpleDom достаточно мощный, чтобы предоставить вам все, что вам нужно, очень простым объектно-ориентированным способом.

    // Create DOM from URL or file
$html = file_get_html('http://www.google.com/');

// Find all images 
foreach($html->find('img') as $element) 
       echo $element->src . '<br>';

// Find all links 
foreach($html->find('a') as $element) 
       echo $element->href . '<br>';

Другой пример -

// Example
$html = str_get_html("<div>foo <b>bar</b></div>"); 
$e = $html->find("div", 0);

echo $e->tag; // Returns: " div"
echo $e->outertext; // Returns: " <div>foo <b>bar</b></div>"
echo $e->innertext; // Returns: " foo <b>bar</b>"
echo $e->plaintext; // Returns: " foo bar"
2 голосов
/ 15 ноября 2009

Используйте функцию get_meta_tags();

Учебник

1 голос
/ 15 ноября 2009

Хватит пытаться анализировать HTMl с помощью регулярных выражений.

RegEx соответствует открытым тегам, кроме автономных тегов XHTML

1 голос
/ 15 ноября 2009

(. *) Соответствует всему, вплоть до ПОСЛЕДНЕЙ "(цитата) в документе, очевидно, не то, что вы хотите. По умолчанию Regex является жадным. Вам нужно использовать

content=\"(.*?)\"

или

content=\"([^\"]*)\"
0 голосов
/ 15 ноября 2009

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

$matches = array();
preg_match("/<meta name=\"Keywords\" content=\"([\w\d;,\.: %&#\/\\\\]*)\"/", $html, $matches);
echo $matches[1]; 
0 голосов
/ 15 ноября 2009

(?i)<meta\\s+name=\"keywords\"\\s+content=\"(.*?)\">

Будет производить что-то вроде:

preg_match('~<meta\\s+name=\"keywords\"\\s+content=\"(.*?)\">~i', $html, &$matches);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...