Php preg_替换与其他规则冲突的正则表达式

Php preg_替换与其他规则冲突的正则表达式,php,regex,preg-replace,Php,Regex,Preg Replace,我这里有这个 <? $regex = array('/@(\w+)/','/#(\w+)/','/((www|http:\/\/)[^ ]+)/'); $replace = array( '<a href="https://www.twitter.com/$1">@$1</a>', '<a href="https://twitter.com/#!/search/%23$1">#$1</a>', '<a h

我这里有这个

<? $regex = array('/@(\w+)/','/#(\w+)/','/((www|http:\/\/)[^ ]+)/');
    $replace = array(
    '<a href="https://www.twitter.com/$1">@$1</a>',
    '<a href="https://twitter.com/#!/search/%23$1">#$1</a>',
    '<a href="\1">\1</a>'
); ?>

<?= preg_replace($regex,$replace,stripslashes($row['tweet_text']));?>

前两个假设是将带有@和#的任何内容转换为链接。这显然是针对twitter的。但是第三个应该是把任何有http或www的东西变成一个链接。但这似乎与前两个打乱联系相冲突


如何使第三个链接与http或www链接不发生冲突?

这充其量只是一种黑客行为,但您可以尝试以下方法:

<? $regex = array('/((www|http:\/\/)[^ ]+)/', '/(?<!>)@(\w+)/', '/(?<!>)#(\w+)/');
    $replace = array(
    '<a href="\1">\1</a>',
    '<a href="https://www.twitter.com/$1">@$1</a>',
    '<a href="https://twitter.com/#!/search/%23$1">#$1</a>'
); ?>


扭转顺序,首先修复链接,然后仅替换
@
#
句柄,如果它们前面没有
(如果它们已经在锚定标记中,则会是这样)。

这最多只能算是一个黑客行为,但您可以尝试以下方法:

<? $regex = array('/((www|http:\/\/)[^ ]+)/', '/(?<!>)@(\w+)/', '/(?<!>)#(\w+)/');
    $replace = array(
    '<a href="\1">\1</a>',
    '<a href="https://www.twitter.com/$1">@$1</a>',
    '<a href="https://twitter.com/#!/search/%23$1">#$1</a>'
); ?>


扭转顺序,首先修复链接,然后仅替换
@
#
句柄,如果它们前面没有
(如果它们已经在锚定标记中,则会是这样)。

@soniccol:基本上,是的。
(?)
只是额外的预防措施。@soniccol:基本上是的。
(?)
只是额外的预防措施。