目标是: 我有一些头衔。我想将文本中的标题转换为链接。但是当它是一个链接时,我不想改变。我正在寻找合适的正则表达式。
我有这样的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));
谢谢大家! :)
答案 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
实际上只有两个部分:
href="
,href='
(当然是转义)或href=
。