RegEx从HTML获取关键字

时间:2009-11-15 15:45:25

标签: php regex

我正在尝试从我正在使用PHP抓取的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=\"(.*)\">)

有什么想法吗?

7 个答案:

答案 0 :(得分:3)

我会使用像DOMDocument和XPath这样的HTML / XML解析器从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似乎是必要的,因为PHP的XPath实现不知道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;
    }
}

答案 1 :(得分:2)

使用函数get_meta_tags();

Tutorial

答案 2 :(得分: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"

答案 3 :(得分:1)

(。*)匹配文档中最后一行“(引用)的所有内容,显然不是你想要的。默认情况下,正则表达式是贪婪的。你需要使用

content=\"(.*?)\"

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

答案 4 :(得分:1)

停止尝试使用正则表达式解析HTMl。

RegEx match open tags except XHTML self-contained tags

答案 5 :(得分:0)

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

会产生类似的东西:

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

答案 6 :(得分:0)

这是一个简单的正则表达式,匹配第一个meta关键字标签。它只允许字符,数字,合法URL字符,HTML实体和空格出现在内容属性中。

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