使用php preg_match_all()捕获uuid,后跟@字符

时间:2018-11-28 17:13:34

标签: php regex string preg-match-all

如何使用preg_match_all()在以下字符串中获取1a1a-1a1a2B2B2-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);

但不能做到

4 个答案:

答案 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]+)+)

Regex demo

$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
)

Demo php

答案 3 :(得分:0)

尝试一下,无论有多少个字符,它都会捕获'@'之后的所有内容

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