Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/267.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,我需要在文本中找到这样的字符串@[0000:0000:Username] 然后我需要提取第一个数字序列(用户id)和用户名。 然后我需要用链接替换它们 我可以提取第一个数字序列,但用户名是可变的。它可以有多个单词(和空格),但也可以是单个单词,例如“John”、“John Doe”、“John Doe Junior” 用户名可以包含字母数字字符、句点、下划线和破折号 这是我现在的用户名,最多4个字: /@\[(\d*):\d*:(\S*|\S*\s*\S*\s*\S*\s*\S*)\]/ 这是

我需要在文本中找到这样的字符串@[0000:0000:Username]

然后我需要提取第一个数字序列(用户id)和用户名。 然后我需要用链接替换它们

我可以提取第一个数字序列,但用户名是可变的。它可以有多个单词(和空格),但也可以是单个单词,例如“John”、“John Doe”、“John Doe Junior”

用户名可以包含字母数字字符、句点、下划线和破折号

这是我现在的用户名,最多4个字:

/@\[(\d*):\d*:(\S*|\S*\s*\S*\s*\S*\s*\S*)\]/
这是我想创建的链接:

<a href="http://www.facebook.com/user-id/" target="_blank">Username</a>

我试着这样做:

<a href="http://www.facebook.com/$1/" target="_blank">$2</a>

如果只找到一个匹配项,则此操作非常有效。一旦有更多的比赛,它就搞砸了


任何帮助都将不胜感激。

这应该可以做到:

/@\[(\d+):\d+:([^\]]+)\]/
[^]]搜索所有不是的字符,因此基本上所有内容都是最终的]

尝试:

/@\[(\d*):\d*:([\w. \-]*)\]/m
[\w.\-]
匹配字母、数字、下划线、句点、空格和破折号<代码>*在允许任意数量的这些之后

@\[(\d+):\d+:([-\w. ]+)\]

@AmalMurali用户名不能超过4个字。@Barmar:嗯,OP说
显然这不起作用。
。确实如此(无论如何,对于问题中显示的示例)。我认为这个问题可以通过解释你的所有要求来改进,@Ziggy.He说“用户名最多4个单词”。这是他描述不需要的限制的方式。是的,你确实需要逃避
-
。它是范围运算符,如
A-Z
中所示。其原始regexp表示
\d*
。因为那不是他有问题的部分,我想这是他想要的。看看如果你忘记逃出
-
,会发生什么。这是真的。但因为我没有把它放在那里,我需要逃离它。这是一种更简单、更安全、更通用的方法。无需在字符类的开头或结尾转义
-
。第二个捕获应该是用户名,而不是第二个数字。谢谢。现在修好了,还有这个。谢谢大家!