href値の内容を取得する

私は正規表現を使用してhrefの内容をキャッチする必要があります。たとえば、次のルールを適用すると href = "www.google.com"、www.google.comを取得したいと考えています。また、私は#価値があるすべてのhrefを無視したいと思います。

さて、私はしばらく遊んでいましたが、これを考えました:

href=(?:\"|\')((?:[^#]|.#.|.#|#.)+)(?:\"|\')

http://www.rubular.com/ で試してみると魅力的ですが、 PHPでpreg_replace_callbackを使用する必要があります。期待される結果が得られません(PHPでテストする場合は、このサイトを使用しています: http://www.pagecolumn.com/tool/pregtest.htm )。

ここで私の間違いは何ですか?

1
追加された 著者 Madara Uchiha,
Acknowledged;)
追加された 著者 misaizdaleka,

3 答え

Since parsing HTML using regular expressions is a Bad Thing™, I suggest a less crude method:

$dom = new DomDocument;
$dom->loadHTML($pageContent);

$elements = $dom->getElementsByTagName('a');

for ($n = 0; $n < $elements->length; $n++) {
    $item = $elements->item($n);
    $href = $item->getAttribute('href');
   //here's your href attribute
}
9
追加された
@ LinusKleenなぜそれは悪いことですか?私はまだ正規表現でHTMLを解析することが悪いことを理解していません。ああ、その男は理由を説明していない、彼はちょうど怒った。説明が役立ちます!
追加された 著者 Mob,
LinusKleenと@marioありがとう。
追加された 著者 Mob,
@モブ:暴言は実際には無意味です(そして教育的効果がない)。人々が「HTMLを解析する」と言うとき、実際には「抽出」を意味します。正規表現が十分であるかのような単純なケースでは、 SGMLとHTMLを正しく解析するには(XMLやXHTMLほどではない)、より複雑なPCREパターンが必要です。 追加された 著者 mario,
すばらしいです!エレガントで効率的なソリューション!アドバイスの素晴らしい部分も!ありがとう!
追加された 著者 misaizdaleka,

まずは:


私は何かのように行くだろう:

href=("|')?([^\s"'])+("|')?
1
追加された

どのように:

href\s*=\s*"([^#"]+#?[^"]*)"
1
追加された
PHP - 日本のコミュニティ [ja]
PHP - 日本のコミュニティ [ja]
4 参加者の

このグループではPHPについて話します。 パートナー:kotaeta.com