2009-11-15 3 views
1

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

Таким образом, если ключевые слова тег выглядит следующим образом:

<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=\"(.*)\">) 

Любые идеи?

ответ

2

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

Tutorial

+0

Когда вы набираете материал для работы, я предполагаю, что получение ключевых слов - это только одна операция, я всегда делаю это в двух укусах. 1) Получить файл и сохранить его локально 2) Есть ли мой пост-выборки разрывая Я просто считаю, что более надежным, как так много может пойти не так, при извлечении из Интернета. Но если вы только после ключевых слов, зачем беспокоиться о получении файла, просто используйте file_get_meta(); – Cups

+0

Не знал о функции get_meta_tags. Удивительный - спасибо! – TWLATL

0

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

бы производить что-то вроде:

preg_match('~<meta\\s+name=\"keywords\"\\s+content=\"(.*?)\">~i', $html, &$matches); 
0

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

$matches = array(); 
preg_match("/<meta name=\"Keywords\" content=\"([\w\d;,\.: %&#\/\\\\]*)\"/", $html, $matches); 
echo $matches[1]; 
1

(. *) Соответствует всем до последней «(цитаты) в документе, очевидно, не то, что вы хотите. Regex жаден по умолчанию. Вы должны использовать

content=\"(.*?)\" 

или

content=\"([^\"]*)\" 
+0

Это не будет работать полностью, так как он использует '^', так что мета-элемент должен быть в начале HTML, который никогда не должен быть дело. – Joost

3

Я хотел бы использовать 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 function представляется необходимым, как реализация XPath в PHP не знает lower-case function.

Или вы фильтрование с 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; 
    } 
} 
+0

Я бы добавил +1, если бы у меня были дневные голоса :( –

+0

+1, кроме, есть встроенный get_meta_tags(). – Svante

+1

@Svante: Но 'get_meta_tags' ожидает имя файла, а не источник HTML. – Gumbo

2

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

Если вы программируете на 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" 
Смежные вопросы