2017-05-22 9 views
-2

複数のウェブサイトからすべてのリンクをキャッチする必要があります。そのために、私はhtmlファイル全体を集めました。それらをすべて配列に入れる正規表現が必要です。HTML文字列からすべての相対リンクと絶対リンクを取得する正規表現

イメージファイルやその他のコードファイルを収集したくありません。ページ自体からのHTMLだけ。

/https://www.hello.com 
/https://www.hello.com/index.php 
/https://www.hello.com/world 
/https://www.hello.com/world.php 
/https://www.hello.com/world.html 
/https://hello.com 
/https://hello.com/world 
/http://www.hello.com 
/http://www.hello.com/world 
/http://hello.com 
/http://hello.com/world 
/www.hello.com 
/www.hello.com/world 
/hello.com 
/hello.com/world 
/hello 
/hello/world 

ではなく、次のように:私はこのために必要となる、正規どのような表現

hello 
hello/world 
hello.png 
hello.zip 
/hello/world.png 
/hello/world.js 


私はそれがこのようなすべてのリンクを収集したいですか?それとも良い方法がありますか? (たぶん、集めて)

+0

なぜdownvoteですか?正当な質問のように見える – Lissy

+0

"良い方法はありますか?":まあ、正規表現はこれをHTML言語の性質によって完全に堅牢にすることはできません。しかし、HTML/XMLパーサを使用する方法もありますが、これは簡単な作業では大したことではありません。だから私は正規表現に行くだろう。 – leemes

答えて

0

<a href="...">という形でハイパーリンクとして「リンク」を定義すると思います。 (すでにPHPの文字列の形式で)次の正規表現は、良いスタート*でなければなりません:preg_match($regex, $html, $match)でこれを使用する場合は

'<\\s*a\\s*[^>]*href\\s*=\\s*"([^"]+)"' 

Test this regex

$match[1]はあなたにリンクを与える、しかし、それはですエンコードされたフォーム(htmlエンティティを含む可能性があります)。それらを削除するには、html_entity_decodeを使用してください。

$link = html_entity_decode($match[1]); 

ます。また、リンクは、ハッシュ記号で始めている同じサイトの単なる断片でリンク除外する必要があります:*この正規表現は、HTMLの定義に準拠していない$link[0] == '#'


を言語(これは100%正しく行うことは不可能だと思います)。たとえば、正規表現は、属性が二重引用符で囲まれていないリンクでは失敗します(引用符で囲まれていないか、一重引用符で囲まれている可能性があります)。

0

PHPQueryのようなものは、正規表現を使用するよりもよいでしょう。理由については、this answerを参照してください。

関連する問題