在字符串中查找@mentions

Rob*_*Rob 3 php regex

尝试用锚标记替换所有出现的@mention,到目前为止,我有:

$comment = preg_replace('/@([^@ ])? /', '<a href="/$1">@$1</a> ', $comment);
Run Code Online (Sandbox Code Playgroud)

采取以下示例字符串:

"@name kdfjd fkjd as@name @ lkjlkj @name"
Run Code Online (Sandbox Code Playgroud)

到目前为止,一切都很好,但我想忽略那个单一的"@"符号.我尝试在"[^ @]"之后使用"+"和"{2,}",我认为这会强制执行最少量的匹配,但它不起作用.

Tim*_*per 8

替换问号(?)量词("可选")并在+角色类后添加("一个或多个"):

@([^@ ]+)
Run Code Online (Sandbox Code Playgroud)


and*_*ber 7

我喜欢 Petah 的答案,但我稍微调整了一下

preg_replace('/(^|\s)@([\w.]+)/', '$1<a href="/users/$2">@$2</a>', $text);
Run Code Online (Sandbox Code Playgroud)

主要区别是:

  • @不包括仅用于显示,不应出现在 URL 中
  • 允许.字符(注意:\w包括下划线)
  • 在替换中,我$1在开头添加以保留空格


Pet*_*tah 6

正则表达式

(^|\s)(@\w+)
Run Code Online (Sandbox Code Playgroud)

可能是你追求的.

它基本上意味着,行的开头或空格,然后是@符号后跟1个或多个单词字符.

例如

preg_match_all('/(^|\s)(@\w+)/', '@name1 kdfjd fkjd as@name2 @ lkjlkj @name3', $result);
var_dump($result[2]);
Run Code Online (Sandbox Code Playgroud)

给你

Array
    (
        [0] => @name1
        [1] => @name3
    )
Run Code Online (Sandbox Code Playgroud)