3

修正しようとしている次のコードがあります。

コード:

$pageData = file_get_contents('111234-2.html');
if(preg_match_all('/<a\s+onclick=["\']([^"\']+)["\']/i', $pageData, $links, PREG_PATTERN_ORDER))
     print_r(array_unique($links[1]));
return false;

フェッチしたいHTMLのサンプル:

    <a onclick="doShowCHys=1;ShowWindowN(0,'http://www.example.com/home/Player.aspx?lpk4=116031&amp;playChapter=False',960,540,111234);return false;" href="javascript:void(0);">
<span class="vt">Welcome

        </span>
        <span class="dur">1m 10s</span>
        <span class="" id="bkmimgview-116031">&nbsp;</span>
        <br class="clear">
    </a>

私が得ている出力:

Array ( [0] => doShowCHys=1;ShowWindowN(0, )

私が望んでいる出力:

Array ( [0] => doShowCHys=1;ShowWindowN(0,'http://www.example.com/home/Player.aspx?lpk4=116031&amp;playChapter=False',960,540,111234);return false;)

どうすればこれを達成できますか?

4

1 に答える 1

4

後方参照を使用してこれを改善することはできますが、ネストされた引用符のレベルがこれ以上ある場合は、かなり運命にあります。

'/<a\s+onclick=(["\'])((?:(?!\1).)+)\1/i'

後方参照を使用すると、すでにキャプチャされているグループを参照できます。したがって、"最初のキャプチャでをキャッチした場合は、非"sの文字列を検索する必要があります。同様に'、最初のキャプチャでをキャッチした場合は、非'sの文字列を検索する必要があります。同じ引用符で終わる"か、'それぞれ。

編集:

@vladrは、はるかに優れた代替手段を提供します。

'/<a\s+onclick=(["\'])(.*?)\1/i'

同じ考えですが、貪欲でない数量詞を使用すると、すべての文字の引用符がないかどうかをテストする必要がなくなります。更新されたRubularリンク:http ://rubular.com/r/VXR1nQ4zf5 。

于 2012-11-12T17:08:36.433 に答える