PHP preg_replace正则表达式排除html <a> tag</a>

时间:2014-04-02 09:16:09

标签: php regex preg-replace

目标是: 我有一些头衔。我想将文本中的标题转换为链接。但是当它是一个链接时,我不想改变。我正在寻找合适的正则表达式。

我有这样的PHP代码:

foreach($res as $r) {
  $new_string = '<a href="#" onclick="getMarkers(1,\\\' \\\',1);locate('.$r->latitude.','.$r->longitude.','.$r->zoom.','.$r->id.',0);">$0</a>';
  $introduction = (preg_replace("/\b$r->title\b(?![^<>]*(?:<|$))/i",$new_string,$introduction))
}

这部分代码不起作用:

preg_replace("/\b$r->title\b(?![^<>]*(?:<|$))/i",$new_string,$introduction)

问题是: 此正则表达式还会更改HTML标记中的可用链接。

感谢大家的光临,我正在躲避答案!

谢谢!


更新的: 我想感谢HamZa这个梦幻般的链接!

我的解决方案是:

 $introduction = (preg_replace("/[^>]*>.*?<\/a>(*SKIP)(*FAIL)|$r->title/im",$new_string,$introduction));

谢谢大家! :)

1 个答案:

答案 0 :(得分:0)

这可能是一个过于简单的解决方案,但您可以使用负面的lookbehind来确保网址前面没有href=。如果没有,则使用您喜欢的任何域REGEX捕获它。

我使用了一个非常笨重的域名验证器,所以这看起来像一团糟,但我会解释它。

$string = 'This is just a bunch of random text. <A HREF="http://www.google.com">google</A> This is 
just a bunch of random text. http://www.yahoo.com This is just a bunch of random text. 
<A HREF="http://www.cnn.com">cnn.com</A> This is just a bunch of random text. http://www.msn.com This 
is just a bunch of random text. ';

$string = preg_replace('~(?<!href="|href=\'|href=)((?:http(?:s)?://)(?:www\.)?[-A-Z0-9.]+(?:\.[-A-Z0-9]{2,4})[-A-Z0-9_./]?(?:[-A-Z0-9#?/]+)?)~i', '<a href="$1">$1</a>', $string);

print $string;

输出:

This is just a bunch of random text. <A HREF="http://www.google.com">google</A> This is 
just a bunch of random text. <a href="http://www.yahoo.com">http://www.yahoo.com</a> This is just a bunch of random text. 
<A HREF="http://www.cnn.com">cnn.com</A> This is just a bunch of random text. <a href="http://www.msn.com">http://www.msn.com</a> This 
is just a bunch of random text.

好的,现在解释一下REGEX:

(?<!href="|href=\'|href=)    ((?:http(?:s)?://)(?:www\.)?[-A-Z0-9.]+(?:\.[-A-Z0-9]{2,4})[-A-Z0-9_./]?(?:[-A-Z0-9#?/]+)?)
              ^                                                ^
              1                                                2

实际上只有两个部分:

  1. 这是一个负面的背后隐藏,可以确保网址前面没有href="href='(当然是转义)或href=
  2. 下一部分只是一个域验证脚本。如果您愿意,可以在这里使用更简单的东西。