Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 用于匹配所有_Php_Regex - Fatal编程技术网

Php 用于匹配所有

Php 用于匹配所有,php,regex,Php,Regex,我的应用程序中有类似facebook的提及功能 在创建帖子或评论时,用户可以使用@符号提及其他用户。 我使用以下jQuery插件: 提及内容按以下格式生成: @@[马尔科·库约宁:2] 所以“@@[用户名:User_id] 目前我有以下模式(和代码): 只有第一个用户被preg_replace转换 br,Marko您可以使用此正则表达式: /@@\[([^:]*):(\d*)\]/ 此正则表达式假定名称不包含:字符 原始正则表达式有两个问题: 结尾处的空格紧跟在]之后,导致第二次提及不匹配,

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

在创建帖子或评论时,用户可以使用@符号提及其他用户。 我使用以下jQuery插件:

提及内容按以下格式生成: @@[马尔科·库约宁:2] 所以“@@[用户名:User_id]

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

只有第一个用户被preg_replace转换


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