替换字符串中的所有url不匹配php中的url模式

时间:2014-03-05 21:17:12

标签: php regex preg-replace

我正在使用以下代码从PHP中的HTML文本块中过滤掉网址。

preg_replace('#<a(?![^>]+?href="?http://keepthisdomain.com/foo/bar"?).*?>(.*?)</a>#i', '\1', $text);

它旨在替换与指定的url模式不匹配的所有url。但是我确实想要包含属性为rel =“shadowbox [a]”的所有标签。

如何修改此preg_replace来执行此操作?

1 个答案:

答案 0 :(得分:0)

对于the reasons set forth in this answer,最好不要使用正则表达式并使用解析器。

那就是说,你可以用正则表达式来做,但这很棘手:

preg_replace('#<a(?![^>]+?\bhref="?http://keepthisdomain\.com/foo/bar"?|[^>]+\brel="shadowbox\[a\]").*?>(.*?)</a>#i', '\1', $text);

正则表达式的详细信息:

<a(?![^>]+?\bhref="?http://keepthisdomain\.com/foo/bar"?|[^>]+\brel="shadowbox\[a\]").*?>(.*?)</a>

Regular expression visualization

在以下四个标签中,只有第三个标签会被替换:

<a href="http://keepthisdomain.com/foo/bar">foo</a> // left alone
<a href="http://keepthisdomain.com/foo/bar" rel="shadowbox[a]">foo</a> // left alone
<a href="http://rejectthis.com/foo/bar">foo</a> // REPLACED
<a href="http://rejectthis.com/foo/bar" rel="shadowbox[a]">foo</a> // left alone

使用.

进行略微调整,使其与.com中的文字\.匹配