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'

反向引用可让您引用已捕获的组。因此,如果您"在第一次捕获中捕获 a,那么您想要找到一串非"s,同样,如果您'在第一次捕获中捕获到 a,那么您想要找到一串非's,无论哪种方式最终得到相同的报价,"'分别。

编辑:

@vladr 提供了一个更好的选择:

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

相同的想法,但非贪婪的量词使得没有必要测试每个字符的非引用性。更新了 Rubular 链接:http ://rubular.com/r/VXR1nQ4zf5 。

于 2012-11-12T17:08:36.433 回答