使用php忽略内联js在正则表达式中“捕捉”链接

时间:2011-07-22 10:33:17

标签: php regex

我试图在PHP中创建一个正则表达式,从html页面(我无法控制)中捕获链接及其内容,并将其替换为我的链接。

即:

<a style="position:absolute;more_styles:more;" href="http://www.google.co.il/" class="something">This is the content</a>

变为:

<a style="position:absolute;more_styles:more;" href="my_function('http://www.google.co.il/')" class="something">This is the content</a>

这是我写的正则表达式:

$content = preg_replace('|<a(.*?)href=[\"\'](.*?)[\"\'][^>]*>(.*?)</a>|i','$3',$content);

这适用于除以下链接之外的所有链接:

<a href="http://google.co.il" onclick="if(MSIE_VER()>=4){this.style.behavior='url(#default#homepage)';this.setHomePage('http://www.google.co.il')}" class='brightgrey rightbar' style='font-size:12px'><b>Make me the home page!</b></a>

显然,正则表达式停在“MSIE_VER()&gt;”因为“[^&gt;] *”部分,当我使用“$ 3”时,我得到了错误的内容。

我几乎尝试了所有选项,但没有运气。

有什么想法吗?

提前谢谢大家..

2 个答案:

答案 0 :(得分:0)

默认情况下。*会逐渐消失 - 例如。它需要onclick参数,因为正则表达式仍然有效 - 替换“。”使用[^ \“] - 它会告诉regexp除了”(不能在URL中)之外的文件“

$content = preg_replace('|<a(.*?)href=[\"\']([^"]*?)[\"\'][^>]*>(.*?)</a>|i','$3',$content);

答案 1 :(得分:0)

首先,您的代码尝试执行与添加my_function不同的操作 - 它尝试删除起始标记并仅将其替换为url。有几种方法来缓和你宣布的目标(即将my_function替换为所有hrefs),最实用的是:

$content = preg_replace('|href=[\"\'](.*?)[\"\']|i',"href=\"my_function('$1')\"",$content);

如果你需要比我使用的更谨慎的方法

$content = preg_replace('|(<a.*?)href=[\"\'](.*?)[\"\'](.*?</a>)|i',"$1href=\"my_function('$2')\"$3",$content);

最后但并非最不重要的是,如果你需要删除标签而不是你所写的内容,请告诉我有百万种方法可以做到。