0

我的应用中有类似 facebook 的提及功能。

创建帖子或评论时,用户可以使用 @ 符号提及其他用户。我使用以下 jQuery 插件: http: //podio.github.com/jquery-mentions-input/

提及按以下格式生成:@@[Marko Kurjonen:2] so "@@[User's name:user_id]

目前我有以下模式(和代码):

$pattern = "/@@\[(.*):(\d*)] /ims";

$matches = array();
preg_match_all($pattern, $input, $matches);
Zend_Debug::dump($matches);
$output = preg_replace($pattern, "<a href=\"". $this->view->baseUrl("user") ."/$2\" class=\"tooltip\">$1</a>", $input);

问题是它只第一次提到。

示例字符串:

$input = "Hello @@[Markku Pelkonen:7] and @@[Marko Kurjonen:2]"

只有第一个用户被 preg_replace 转换。

兄弟,马尔科

4

1 回答 1

2

您可以使用此正则表达式:

/@@\[([^:]*):(\d*)\]/

此正则表达式假定名称不包含:字符。

原来的正则表达式有两个问题:

  • 最后的空格,就在 之后],导致第二次提及失败,因为它位于输入的末尾。(如果你删除它,贪婪的量词将吞噬整个输入字符串。)
  • *in贪婪地匹配(.*)0 个或多个实例,这意味着它将匹配尽可能多的字符,直到下一个标记无法匹配,它会回溯并尝试匹配下一个标记。这就是为什么如果您删除空格,整个输入字符串将被吞噬,如上所述。

也可以稍微修复您的正则表达式以使其工作(除了我上面提到的解决方案):

/@@\[(.*?):(\d*)]/s

mflag 和flag在i这里没用,所以我把它们去掉。你从不在你的正则表达式中使用^or $,所以mflag 没用。该标志仅在 regex 中i有字母时才有用,这里不是这种情况。

*?在这里使用量词,这是匹配 0 或更多的惰性版本。它将匹配尽可能少的字符,以便匹配下一个标记。

于 2012-08-07T06:25:42.343 回答