1

preg_match を使用して、内部で言及されている URL とタグを見つけて、それらを更新されたドメイン名に置き換えることができるようにしようとしています。現在、見つかったURLを印刷できるように、これをhrefタグで把握するための検索スクリプトを取得しようとしています。ここに私が持っているものがあります:

$matches = array();
$search="domain.com";
preg_match('|(<a\s*[^>]*href=[\'"]?)|',$prod['value'],$matches);
echo '<p>'.$matches[1].'</p>';

$prod['value']私がふるいにかけようとしているコンテンツを指します

4

1 に答える 1

3

あなたのコード

$matches = array();
$search="domain.com";
preg_match('|(<a\s*[^>]*href=[\'"]?)|',$prod['value'],$matches);
echo '<p>'.$matches[1].'</p>';

まず、呼び出し$matchesの前に定義する必要はありません。preg_match変数名を指定するだけで、通知PHPをスローすることはありません。

第二に$search、質問に関連していないようです?..

3番目...入力例を示していないことを念頭に置いて、入力からすべてのリストを取得できるように、実際に必要であると仮定します。preg_match_allURLs

4 つ目は、3 つに続いて、 のコンテンツとしてvar_dumporprint_rの代わりにが必要であることを意味します。echo$matches[X]array

正規表現

さて、正規表現パターンが実際に行うことについて...

(<a\s*[^>]*href=['"]?)
  • (- キャプチャ グループを開始します
  • <a\s*- 0 個以上の空白文字<aが続く一致
  • [^>]*- ではない0 個以上の文字に一致>
  • href=- マッチhref=
  • ['"]?- オプションで、'または"
  • )- キャプチャ グループを終了します

これはすべて、例の入力に対して実行すると、正規表現が<a href="最初のリンクの例 (google) と<a class="fancyStyle" href="2 番目のリンクの例 (youtube) から一致することを意味します。

/**
Output from:

preg_match_all('|(<a\s*[^>]*href=[\'"]?)|', $string, $matches);
var_dump($matches);

*/
array(2) {
  [0]=>
  array(2) {
    [0]=>
    string(9) "<a href=""
    [1]=>
    string(28) "<a class="fancyStyle" href=""
  }
  [1]=>
  array(2) {
    [0]=>
    string(9) "<a href=""
    [1]=>
    string(28) "<a class="fancyStyle" href=""
  }
}

作業コード

コードにはいくつかの問題がありますが、期待どおりの結果を得るのを妨げているのは、到達する前にURLキャプチャを停止することです。

次の正規表現は、タグの属性URL内にある に一致します。hrefa

#<a\s.*?(?:href=['"](.*?)['"]).*?>#is

説明

  • <aa-タグの開始に一致
  • \s.*?-任意の文字が0回以上続く空白文字に一致します
  • (?:- 非キャプチャ グループを作成します
  • href=- マッチhref=
  • ['"]'- またはのいずれかに一致"
  • (.*?)- キャプチャ グループを作成し、前に0 個以上の文字を一致させます...
  • ['"]- 一致'または"
  • )- 非キャプチャ グループを終了します
  • .*?>- 任意の文字に 0 回以上一致し、その後に続く>
  • i- 正規表現の大文字と小文字を区別しないようにします
  • s-.すべての文字に一致させます (改行を含む)

実施例

preg_match_all('#<a\s.*?(?:href=[\'"](.*?)[\'"]).*?>#is', $string, $matches);
var_dump($matches);

/**
array(2) {
  [0]=>
  array(2) {
    [0]=>
    string(34) "<a href="http://www.google.co.uk">"
    [1]=>
    string(65) "<a class="fancyStyle" href="http://www.youtube.com" id="link136">"
  }
  [1]=>
  array(2) {
    [0]=>
    string(23) "http://www.google.co.uk"
    [1]=>
    string(22) "http://www.youtube.com"
  }
}

*/

入力例

すべてのコードは、preg_match関数への入力として以下を使用します...

$string = <<<EOC
    <!doctype html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title of page</title>
    </head>
    <body>
        <h1>Main Page title</h1>
        <p>
            The following is a <a href="http://www.google.co.uk">link to google</a>.
            This is <a class="fancyStyle" href="http://www.youtube.com" id="link136">another link</a>
        </p>
    </body>
    </html>
EOC;
于 2013-09-19T15:17:07.717 に答える