首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP正则表达式模式用于匹配所有

PHP正则表达式模式用于匹配所有
EN

Stack Overflow用户
提问于 2012-08-07 14:18:35
回答 1查看 163关注 0票数 0

我在我的应用程序中有一个-facebook式的提及功能。

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

提示词的生成格式如下:@@Marko Kurjonen:2 so "@@User's name:user_id

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

代码语言:javascript
复制
$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);

问题是它只做了第一次提到。

示例字符串:

代码语言:javascript
复制
$input = "Hello @@[Markku Pelkonen:7] and @@[Marko Kurjonen:2]"

只有第一个用户可以通过preg_replace进行转换。

br,Marko

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-07 14:25:42

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

代码语言:javascript
复制
/@@\[([^:]*):(\d*)\]/

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

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

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

也可以对您的正则表达式进行一些修改以使其正常工作(除了我上面提到的解决方案):

代码语言:javascript
复制
/@@\[(.*?):(\d*)]/s

m标志和i标志在这里没有用,所以我删除了它们。您从未在正则表达式中使用过^$,因此m标志是无用的。只有当正则表达式中有字母时,i标志才有用,这里不是这种情况。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11840304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档