HTML anahtar kelimeleri almak için RegEx

7 Cevap php

Ben PHP ile kazıma ediyorum bir HTML sayfası anahtar kelimeleri elde etmek için çalışıyorum.

Yani, anahtar sözcükler bu gibi görünüyor eğer:

<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">

Bunu geri almak istiyorum:

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

Ben bir regex inşa ettik, ama hile yapmıyor.

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

Herhangi bir fikir?

7 Cevap

Işlevini kullanın get_meta_tags();

Tutorial

Ben DOM düğümleri almak için DOMDocument ve XPath gibi bir HTML / XML ayrıştırıcı kullanmak istiyorsunuz:

$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 seems to be necessary as PHP’s XPath implementation does not know the lower-case function .

Ya PHP ile filtreleme yapmak:

$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;
    }
}

Regex kullanarak durdurun. Bu, yavaş kaynak yoğun ve çok çevik değil.

Eğer PHP programlama yapıyorsanız kontrol http://simplehtmldom.sourceforge.net/ - SimpleDom size çok basit bir nesne yönelimli bir şekilde ihtiyacınız olan her şeyi almak için yeterince güçlüdür.

    // 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>';

Başka bir örnek -

// 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"

(. *) Belgede SON "(alıntı) kadar her şeyi maçları, belli ki istediğini değil. Regex varsayılan açgözlü olduğunu. Siz kullanmanız gerekir

content=\"(.*?)\"

veya

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

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

Gibi bir şey üretmek olacaktır:

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

Bu ilk meta anahtar kelime etiketi eşleşen basit bir regex vardır. Sadece karakterler, sayılar, yasal URL karakterler, HTML kurum ve alanlarda içerik özniteliği içinde görünmesini sağlar.

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