使用正则表达式从网站的HTML源中提取内容

时间:2012-11-12 17:02:02

标签: php regex html-parsing

我有以下代码,我正在尝试修复。

代码:

$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;)

我如何实现这一目标?

1 个答案:

答案 0 :(得分:4)

你可以使用反向引用来改善这一点,但如果有更多级别的嵌套引号,你就注定要失败。

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

反向引用允许您引用已捕获的组。因此,如果您在第一次捕获中捕获了",那么您希望找到一个非"的字符串,同样,如果您在第一次捕获中捕获了',那么你想找到一个非'的字符串,并且两种方式分别以"'结尾。

修改

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

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

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