这个正则表达式:
$text = preg_replace("/@([^\s]+)/", "<a href=\"\\0\">\\0</a>", $text);
..将以@开头的所有单词转换为链接。因此它将@joshua
变为:
<a href="@joshua">@joshua</a>..
但我需要它:
<a href="joshua">@joshua</a>..
所以没有链接地址中的@
。任何人都可以帮我解决这个问题吗?
答案 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);
这是未经测试的,但应该有用。