-2

正規表現を使用して HTML ファイルから複数の URL を抽出しようとしています。HTML コードは次のようになります。

<h1 class="article"><a href="http://www.domain1.com/page-to-article1" onmousedown="return(...)
<h1 class="article"><a href="http://www.domain2.com/page-to-article2" onmousedown="return(...)
<h1 class="article"><a href="http://www.domain3.com/page-to-article3" onmousedown="return(...)
<h1 class="article"><a href="http://www.domain3.com/page-to-article4" onmousedown="return(...)

<h1 class="article"><a href="との間の URL のみを抽出したいと思い" onmousedown="return(...)ます。http://www.domain1.com/page-to-article1http://www.domain2.com/page-to-article2http://www.domain3.com/page-to-article3

4

1 に答える 1

4

すでに回答およびコメントされているように、このタスクには正規表現を使用しないでください。ただし、本当にそれを主張する場合は、次の正規表現を使用できます。

/\<h1 class="article"\>\<a href="([^"]*)" onmousedown="return/

この正規表現の作成のウォークスルー:

  1. さて、あなたは実際に何を探していますか?この行のようなもの:

    <h1 class="article"><a href="http://www.domain1.com/page-to-article1" onmousedown="return
    
  2. ただし、特定の文字は正規表現では許可されていません。この例では、<および>文字は無効です。\したがって、不正な文字の前にバックスラッシュ ( ) を追加してエスケープする必要があります。

    \<h1 class="article"\>\<a href="http://www.domain1.com/page-to-article1" onmousedown="return
    
  3. これは、正規表現に既に含まれている URL とのみ一致します。任意の URL に一致する必要があります。一般に、このコンテキストで URL はどのように見えるでしょうか? URL はさまざまな形式で存在するため、これを言うのは困難です。

    簡単に説明すると、URL は文字を含まない一連のテキストです(タグの属性"が終了するため)。正規表現では、これは: を除く任意の文字に一致します。href<a>[^"]"

    URL は、 を除く 1 文字だけではなく"、たくさんの文字で構成されています。したがって、0 個以上の文字に一致*するパターン ( ) にアスタリスク ( ) を追加します。[^"]これにより、 が得られ[^"]*ます。任意の長さの URL を照合できるようになりました。

    実際にテキストから URL を取得する必要があることを忘れてはなりません (一致/検出するだけではありません)。グループを定義することにより、グループの内容が個別に返されます。パターンを括弧で囲んでグループを定義します。結果: ([^"]*).

    これを、最初に使用したパターンに置き換えることができます。

    \<h1 class="article"\>\<a href="([^"]*)" onmousedown="return
    
  4. 最後にすべきことの 1 つは、正規表現プロセッサに、行全体に一致させるか (つまり、パターンが行全体に一致する場合にのみ結果を検索するか)、または行の一部にも一致させるかどうかを伝えることです。後者のオプションを使用します。そのために、パターンをスラッシュで囲みます。

    /\<h1 class="article"\>\<a href="([^"]*)" onmousedown="return/
    
  5. 最後のステップで、修飾子を追加できます。これらは、正規表現プロセッサがパターンを照合するときに使用する設定のようなものです。修飾子を追加iして、パターンの大文字と小文字を区別しないようにします。

    /\<h1 class="article"\>\<a href="([^"]*)" onmousedown="return/i
    

正規表現チート シートを見て、正規表現で何が起こっているのかを理解しようとすることをお勧めします。ブックマークに追加 (または印刷) します。正規表現に出くわしたり、自分で正規表現が必要な場合はいつでも、それを使用してみてください。正規表現は、初心者にとっては難しい魔法のように思えますが、自分で適切に使用できるようになれば非常に便利です。


使用例:

<?php

$html = <<<EOF
<h1 class="article"><a href="http://www.domain1.com/page-to-article1" onmousedown="return(...)
<h1 class="article"><a href="http://www.domain2.com/page-to-article2" onmousedown="return(...)
<h1 class="article"><a href="http://www.domain3.com/page-to-article3" onmousedown="return(...)
<h1 class="article"><a href="http://www.domain3.com/page-to-article4" onmousedown="return(…)
EOF;

preg_match_all('/\<h1 class="article"\>\<a href="([^"]*)" onmousedown="return/i', $html, $matches);

print_r($matches[1]);
// Array
// (
//     [0] => http://www.domain1.com/page-to-article1
//     [1] => http://www.domain2.com/page-to-article2
//     [2] => http://www.domain3.com/page-to-article3
//     [3] => http://www.domain3.com/page-to-article4
// )

?>
于 2013-10-16T23:17:16.793 に答える