2016-05-22 4 views
1

は私がphpを使ってウェブサイトから特定のタイプのリンクを抽出するには?

http://www.example.com/pages/12345667/some-texts-available-here

私は上記の形式のようにすべてのリンクを抽出したい。..

リンクは次のようなものでPHPを使用してWebページからのリンクの特定のタイプを抽出しようとしています。

maindomain.com/pages/somenumbers/sometexts

これまでのところ私は、Webページからのすべてのリンクを抽出することができますが、上記のフィルタが起きていません。どのように私はこれを達成することができますか?

提案がありますか?

<?php $html = file_get_contents('http://www.example.com'); //Create a new DOM document $dom = new DOMDocument; @$dom->loadHTML($html); $links = $dom->getElementsByTagName('a'); //Iterate over the extracted links and display their URLs foreach ($links as $link){ //Extract and show the "href" attribute. echo $link->nodeValue; echo $link->getAttribute('href'), '<br>'; } ?>
+0

正規表現は、HTMLの良い友人ではないですが、私はそれがリンクの場合は仕事ができると思いますページの「領域」にあります。その部分をstrpos()で切り取り、strip_tags()を使って正規表現に問題を引き起こす可能性のあるタグを削除することができます。サンプルデータはありますか? – Andreas

+0

待って..あなたは正規表現が必要ですか? – Andreas

+0

** [this](https://regex101.com/r/zG7pS3/1)** – rock321987

答えて

0

これはわずかな推測ですが、私は間違ってそれを得た場合、あなたはまだそれを行う方法を見ることができます。

foreach ($links as $link){ 
    //Extract and show the "href" attribute. 
    If(preg_match("/(?:http.*)maindomain\.com\/pages\/\d+\/.*/",$link->getAttribute('href')){ 
     echo $link->nodeValue; 
     echo $link->getAttribute('href'), '<br>'; 
    } 
} 
2

あなたはDOMXPathを使うことの最大を使用してXPathクエリで後にそれを使用するDOMXPath::registerPhpFunctionsで機能を登録することができます:

function checkURL($url) { 
    $parts = parse_url($url); 
    unset($parts['scheme']); 

    if (count($parts) == 2 && 
     isset($parts['host']) && 
     isset($parts['path']) && 
     preg_match('~^/pages/[0-9]+/[^/]+$~', $parts['path'])) { 
     return true; 
    } 
    return false; 
} 

libxml_use_internal_errors(true); 

$dom = new DOMDocument; 
$dom->loadHTMLFile($filename); 

$xp = new DOMXPath($dom); 

$xp->registerNamespace("php", "http://php.net/xpath"); 
$xp->registerPhpFunctions('checkURL'); 

$links = $xp->query("//a[php:functionString('checkURL', @href)]"); 

foreach ($links as $link) { 
    echo $link->getAttribute('href'), PHP_EOL; 
} 

あなたが欲しいだけのリンクを抽出し、このように。

+0

くそー、私は遅すぎました - 私の答えを参考にしていました:)私はあなたの解決策(+1)が好きですが、このシナリオで 'starts-with()'を使わないのはなぜですか? – Jan

+1

@Jan: 'starts-with'は同時にURLのスキーム部分の有無にかかわらず動作できません。そして、私は目標がホストが何であるかをテストするのではなく、パスがどのように見えるかを詳しく調べることだと思います。関数を使用すると、必要に応じて簡単に他のチェックを追加できます。 –

0

あなたはすでにパーサーを使用しているので、前進してDOM上でXPathクエリを使用することができます。 XPathクエリは、同様にstarts-with()のような機能を提供しますので、これはうまくいくかもしれない:

$xpath = new DOMXpath($dom); 
$links = $xpath->query("//a[starts-with(@href, 'maindomain.com')]"); 

ループ彼らの上に後から:

foreach ($links as $link) { 
    // do sth. with it here 
    // after all, it is a DOMElement 
} 
関連する問題