我在我的应用程序中有一个-facebook式的提及功能。
在创建帖子或评论时,用户可以使用@ sign提到其他用户。我使用以下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进行转换。
br,Marko
发布于 2012-08-07 14:25:42
您可以使用此正则表达式:
/@@\[([^:]*):(\d*)\]/此正则表达式假定名称不包含:字符。
原始正则表达式有两个问题:
]之后,导致第二次提及失败,因为它是在输入的末尾。(如果你移除它,贪婪的量词将吞噬整个输入字符串。)* in (.*)匹配0个或更多的实例,贪婪地匹配,这意味着它将匹配尽可能多的字符,直到下一个令牌无法匹配,在那里它将回溯并尝试匹配下一个令牌。如上所述,这就是如果您删除空格,整个输入字符串将被吞噬的原因。也可以对您的正则表达式进行一些修改以使其正常工作(除了我上面提到的解决方案):
/@@\[(.*?):(\d*)]/sm标志和i标志在这里没有用,所以我删除了它们。您从未在正则表达式中使用过^或$,因此m标志是无用的。只有当正则表达式中有字母时,i标志才有用,这里不是这种情况。
我在这里使用*?量词,它是match 0或更多的惰性版本。它将匹配尽可能少的字符,只匹配下一个要匹配的标记。
https://stackoverflow.com/questions/11840304
复制相似问题