1

htmlentitiesでエンコードされたHTMLコードを含む文字列があります。

私がやりたいのは、ドキュメント内の次のパスの間のすべてのパスを見つけることです。

href = "XXX"、src="XXX"。

http、https、ftp、fileで始まるすべてのリンクを検索する正規表現があり、それを繰り返さないようにしています。

"/\b(?:(?:https?|ftp|file):\/\/|www\.|ftp\.)[-A-Z0-9+&@#\/%=~_|$?!:,.]*[A-Z0-9+&@#\/%=~_|$]/i"

何か案が?

4

2 に答える 2

5

更新: 正規表現で行うのは信頼できません。src=".." または href=".." ステートメントは、コメントまたは JavaScript ステートメントの一部にすることができます。信頼できるリンクを取得するには、XPath を使用することをお勧めします。

<?php

$html = file_get_contents('http://stackoverflow.com/questions/14782334/regex-expression-to-find-all-paths-in-a-html-string/14782594#14782594');
$doc = new DOMDocument();
@$doc->loadHTML($html);
$selector = new DOMXPath($doc);

$result = $selector->query('//a/@href | //@src');
foreach($result as $link) {
    echo $link->value, PHP_EOL;
}

"正規表現を使用する場合、href または src 属性の = の間のコンテンツを取得しようとします。正規表現を使用してこのページからリンクを取得する方法の例を次に示します。

<?php

$html = file_get_contents('http://stackoverflow.com/questions/14782334/regex-expression-to-find-all-paths-in-a-html-string');

preg_match_all('/href="(?P<href>.*)"|src="(?P<src>.*)"/U', $html, $m);
                                                        <--- note the U to make the 
                                                             pattern ungreedy
var_dump($m['href']);
var_dump($m['src']);
于 2013-02-08T22:47:10.577 に答える
4

DOM を使用して、特定のタグ内のすべてのリンクを見つけることができます。たとえば、アンカー タグから URL を取得するには、次のようにします (テストされていませんが、正しい方向を示しているはずです)。

function findPaths($url)
{
   $dom = new DOMDocument();

   //$url of page to search, the "@' is there to suppress warnings
   @$dom->loadHTMLFile($url) 

   $paths = array();
   foreach($dom->getElementsByTagName('a') as $path)
   {
     $paths[] = array('url' => $path->getAttribute('href'), text => $path->nodeValue);
   }
   return $paths;
}

XPath を使用して、DOM の読み込みと評価をさらに簡単にすることができます。

于 2013-02-08T23:09:37.100 に答える