Php 用于匹配所有
我的应用程序中有类似facebook的提及功能 在创建帖子或评论时,用户可以使用@符号提及其他用户。 我使用以下jQuery插件: 提及内容按以下格式生成: @@[马尔科·库约宁:2] 所以“@@[用户名:User_id] 目前我有以下模式(和代码): 只有第一个用户被preg_replace转换Php 用于匹配所有,php,regex,Php,Regex,我的应用程序中有类似facebook的提及功能 在创建帖子或评论时,用户可以使用@符号提及其他用户。 我使用以下jQuery插件: 提及内容按以下格式生成: @@[马尔科·库约宁:2] 所以“@@[用户名:User_id] 目前我有以下模式(和代码): 只有第一个用户被preg_replace转换 br,Marko您可以使用此正则表达式: /@@\[([^:]*):(\d*)\]/ 此正则表达式假定名称不包含:字符 原始正则表达式有两个问题: 结尾处的空格紧跟在]之后,导致第二次提及不匹配,
br,Marko您可以使用此正则表达式:
/@@\[([^:]*):(\d*)\]/
此正则表达式假定名称不包含:
字符
原始正则表达式有两个问题:
- 结尾处的空格紧跟在
之后,导致第二次提及不匹配,因为它位于输入的末尾。(如果删除它,贪婪的量词将吞噬整个输入字符串。)]
贪婪地匹配0个或多个实例,这意味着它将匹配尽可能多的字符,直到下一个标记无法匹配为止,它将回溯并尝试匹配下一个标记。这就是为什么如上所述,如果删除空格,整个输入字符串将被占用(*)中的
*
m
标志和i
标志在这里是无用的,因此我将它们删除。您从不在正则表达式中使用^
或$
,因此m
标志是无用的。i
标志只有在正则表达式中有字母时才有用,而这里不是这样
我在这里使用了
*?
量词,这是match 0或更多的惰性版本。它将尽可能少地匹配字符,以便匹配下一个标记。我选择[^\]]
而不是[^:::][/code>,因为括号定义了整个标记内容和:(\d*)即使用户名中有:
,也可以检测到。@Backlin:我不确定用户名的格式。如果用户名中有]
,那么我不知道OP会如何解决混淆。是的,你是对的。如果你使用[^::][/code>用户名中不允许冒号,如果你使用[^\]]
不允许使用右括号。但我想无论如何都不应该使用这些字符来避免类似的问题。
$input = "Hello @@[Markku Pelkonen:7] and @@[Marko Kurjonen:2]"
/@@\[([^:]*):(\d*)\]/
/@@\[(.*?):(\d*)]/s