如何使用preg_match_all()
在以下字符串中获取1a1a-1a1a
和2B2B2-B2
:
$string = 'Hello @1a1a-1a1a and @2B2B2-B2 too';
我的目标是捕获每个@
和一个uuid。
我尝试过:
preg_match_all("/@(.*)/", $string, $matches);
preg_match_all("/@.*?/U", $string, $matches);
preg_match_all("/@([^\"]+)/si", $a, $matches);
但不能做到
答案 0 :(得分:2)
使用li a:focus {
background: #00C6F0;
}
后与任何字符串匹配的/(?<=@)[\w-]+/
模式
@
输出
preg_match_all("/(?<=@)[\w-]+/", $string, $matches);
print_r($matches[0]);
在demo中查看结果
答案 1 :(得分:2)
@(.*)
正则表达式与@
匹配,并且贪婪地匹配除换行符(即该行的其余部分)以外的任何0个或多个字符。 /@.*?/U
是同义词模式,它等于/@.*/
,@
之后的文本只是没有被捕获到一个组中。 @([^\"]+)
匹配@
并将第"
以外的任何一个或多个字符捕获到组1中,并且将匹配第一个"
或字符串的结尾(如果没有) "
。
我建议使用
preg_match_all('~@\K[\w-]+~', $s, $matches)
请参见regex demo。 @\K[\w-]+
将匹配@
,\K
将从匹配中将其删除,而[\w-]+
将匹配1个或多个单词或将返回的-
个字符。< / p>
要使模式更具限制性,例如,仅匹配@
之后的字母或数字(可以用连字符分隔),可以使用
'~@\K[A-Z0-9]+(?:-[A-Z0-9]+)*~i'
请参见this regex demo。在这里,[A-Z0-9]+
匹配1个或更多字母数字字符,而(?:-[A-Z0-9]+)*
将匹配0个或多个重复的-
,后跟1+个字母数字字符。 i
修饰符将使模式不区分大小写。
答案 2 :(得分:1)
您的正则表达式匹配:
@(.*)
匹配@并成组捕获超过0次贪婪的任意字符,包括将与示例中的所有字符匹配的空格@.*?
匹配@,后跟0+次非贪婪字符,它们只会匹配@
@([^\"]+)
匹配@并捕获不匹配"
的组,而该组将匹配示例中的所有要捕获每个@
后跟一个uuid,可以使用character class列出允许匹配的内容,并在非捕获组中以破折号开头1次以上重复该模式。
如果只想匹配uuid,则可以在捕获组中捕获值。
@([a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)+)
$string = 'Hello @1a1a-1a1a and @2B2B2-B2 too';
preg_match_all("/@([a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)+)/", $string, $matches);
print_r($matches[1]);
结果
Array
(
[0] => 1a1a-1a1a
[1] => 2B2B2-B2
)
答案 3 :(得分:0)
尝试一下,无论有多少个字符,它都会捕获'@'之后的所有内容
preg_match_all(“ @(\ w)* /”,$ string,$ matches)