如何更改该正则表达式脚本

时间:2011-08-26 08:01:37

标签: php regex preg-replace

这个正则表达式:

$text = preg_replace("/@([^\s]+)/", "<a href=\"\\0\">\\0</a>", $text);

..将以@开头的所有单词转换为链接。因此它将@joshua变为:

<a href="@joshua">@joshua</a>.. 

但我需要它:

<a href="joshua">@joshua</a>.. 

所以没有链接地址中的@。任何人都可以帮我解决这个问题吗?

4 个答案:

答案 0 :(得分:4)

$text = preg_replace('/@(\S+)/', '<a href="$1">$0</a>', $text);

注意:[^\s]可以缩短为\S

注意:$0优先于\\0进行反向引用(如manual中所述)。

答案 1 :(得分:3)

$text = preg_replace("/@([^\s]+)/", "<a href=\"\\1\">\\0</a>", $text);

如果你看到preg_replace documentation,就会发现\\0是整场比赛,而\\N是第N场比赛。由于您已经捕获了名称(([^\s]+)部分),因此您只需将\\0:s中的一个更改为\\1

编辑:同样从文档中,您会看到从PHP 4.0.4开始,首选表单不是\\N,而是$N。因此,如果您有最近(或更确切地说,不是旧的)PHP版本,则应将其更改为$0$1

答案 2 :(得分:0)

您需要使用\\1来获取括号中的部分; \\0是整场比赛。所以你需要的只是

$text = preg_replace("/@([^\s]+)/", "<a href=\"\\1\">\\0</a>", $text);

答案 3 :(得分:-1)

$text = preg_replace("/(@)([^\s]+)/", "<a href=\"\\2\">\\1\\2</a>", $text);

这是未经测试的,但应该有用。