使用php preg_match_all()捕获后跟@character的UUID

使用php preg_match_all()捕获后跟@character的UUID,php,regex,string,preg-match-all,Php,Regex,String,Preg Match All,如何使用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

如何使用
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+次,包括将匹配示例中所有字符的空格
  • @.*?
    匹配@,后跟任何字符0+次非贪婪,该字符只匹配
    @
  • @([^\“]+)
    匹配@并在组中捕获匹配的内容,而不是与示例中的所有内容匹配的
要捕获后跟uuid的每个
@
,您可以使用列出您允许匹配的内容,并在非捕获组中重复该模式1+次

如果只想匹配uuid,可以在捕获组中捕获值

@([a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)+)

结果

Array
(
    [0] => 1a1a-1a1a
    [1] => 2B2B2-B2
)

您的正则表达式ar匹配:

  • @(.*)
    匹配@并在组中捕获任何字符0+次,包括将匹配示例中所有字符的空格
  • @.*?
    匹配@,后跟任何字符0+次非贪婪,该字符只匹配
    @
  • @([^\“]+)
    匹配@并在组中捕获匹配的内容,而不是与示例中的所有内容匹配的
要捕获后跟uuid的每个
@
,您可以使用列出您允许匹配的内容,并在非捕获组中重复该模式1+次

如果只想匹配uuid,可以在捕获组中捕获值

@([a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)+)

结果

Array
(
    [0] => 1a1a-1a1a
    [1] => 2B2B2-B2
)
@(.*)
正则表达式匹配一个
@
,贪婪地匹配除换行符以外的任何0个或更多字符(即行的其余部分)。
/.*/U
是同义模式,它等于
/./
之后的文本不会被捕获到组中。
@([^\”+)
匹配
@
并将
以外的任何一个或多个字符捕获到组1中,这些字符要么匹配到第一个
,要么匹配到字符串末尾(如果没有

我建议使用

preg_match_all('~@\K[\w-]+~', $s, $matches)
请参阅。
@\K[\w-]+
将匹配
@
\K
将从匹配中删除它,并且
[\w-]+
将匹配将返回的一个或多个单词或
-
字符

要使模式更具限制性,例如,仅匹配可以连字符分隔的
@
后面的字母或数字,可以使用

'~@\K[A-Z0-9]+(?:-[A-Z0-9]+)*~i'
请参见。此处,
[A-Z0-9]+
匹配1个或多个字母数字字符,
(?:-[A-Z0-9]+*)
将匹配0个或多个重复的
-
,后跟1+字母数字字符。
i
修饰符将使模式不区分大小写。

@(.*)
regex匹配一个
@
和除换行符以外的任何0个或更多字符(即行的其余部分)。
/.*?/U
是一个同义模式,它等于
/.*/
@
之后的文本不会被捕获到组中。
@([^\“]+)
匹配
@
并将
以外的任何一个或多个字符捕获到组1中,这些字符要么匹配到第一个
,要么匹配到字符串末尾(如果没有

我建议使用

preg_match_all('~@\K[\w-]+~', $s, $matches)
请参阅。
@\K[\w-]+
将匹配
@
\K
将从匹配中删除它,并且
[\w-]+
将匹配将返回的一个或多个单词或
-
字符

要使模式更具限制性,例如,仅匹配可以连字符分隔的
@
后面的字母或数字,可以使用

'~@\K[A-Z0-9]+(?:-[A-Z0-9]+)*~i'

请参见。此处,
[A-Z0-9]+
匹配1个或多个字母数字字符,
(?:-[A-Z0-9]+*)
将匹配0个或多个重复的
-
字符,后跟1个以上字母数字字符。
i
修饰符将使模式不区分大小写。

尝试此操作,它将捕获“@”之后的所有字符,无论有多少个字符


preg_match_all(“@(\w)*/”,$string,$matches)

试试这个,不管有多少个字符,它都会捕获“@”之后的所有内容


preg_match_all(“@(\w)*/”,$string,$matches)

使用
preg_match_all(“/\K[\w-]+/”,$a,$matches);
您的正则表达式太松散了。您需要让模式在某个点停止。您可以使用
@\S+
它将一直运行,直到找到一个空格。或者更高的正则表达式也应该可以工作。使用
preg_match_all(“/\K[\w-]””,$a,$matches);
您的正则表达式太松散。您需要让模式在某个点停止。您可以使用
@\S+
,它将一直运行,直到找到一个空格。..或更高的正则表达式也可以工作。