我是正则表达式的菜鸟。
我希望有人可以解释#(\ w +)=([\'“])(。*)\ 2#U中发生了什么。
preg_match_all('#(\w+)=([\'"])(.*)\\2#U', $str, $matches);
提前致谢。
答案 0 :(得分:8)
让我们一块一块地分开。首先,请注意preg_match_all
围绕其正则表达式使用分隔符,因此#
与任何内容都不匹配,但U
非常重要:it's a modifier which makes the match "ungreedy"。这意味着,所有量词(?
,*
,+
,{,}
)都匹配,而不是匹配为很多。 小尽可能。然后,一块一块地:
(\w+)
:\w
匹配“单词字符” - 字母数字或下划线; +
匹配其中一个或多个;并且括号将其分组并将其存储在第一个捕获组中,可以使用\1
进行访问。=
:匹配文字=
。很简单:)([\'"])
:方括号引入了一个字符类,这是一种说“匹配任何这些字符”的简写方式。在这里,字符类是['"]
,但由于它是单引号字符串,因此'
必须进行转义。因此,这匹配'
或"
,并将结果存储在第二个捕获组中,可以使用\2
进行访问。这是此特定正则表达式的唯一相关捕获组。(.*)
:.
匹配任何非换行符,*
匹配任意数字(零或更多)。这就是U
修饰符很重要的原因!没有它,这将始终匹配到线的末端;有了它,它将匹配,直到下一个匹配。请注意,因为它在括号中,所以它位于第三个捕获组中,可以使用\3
进行访问(令人震惊)。\\2
:如果我们不必逃避反斜杠,那么这只是\2
:第二个捕获组的内容。在这种情况下,它是我们在步骤3中匹配的任何一个引用。总而言之,这个正则表达式大致相当于一个变量名称(步骤1),后跟一个等号(步骤2),后跟一个字符串(步骤3-5); \2
的原因是正则表达式与"string'
不匹配,U
修饰符的原因是foo="string" bar="strung"
将返回foo="string"
的两个匹配项{1}}和bar="strung"
(\1
为foo
和bar
,\3
为string
和strung
),而不是foo="string" bar="strung"
的单一,贪婪匹配(\1
为foo
且\3
为string" bar="strung
)。一些例子是
foo_bar_123="John's applesauce."
100='seventeen'
banana_split=""
_="This is a normal string"
只要每个实体本身在一条线上,这些实体就可以分散在整个字符串中,同一条线上或不同的线条上,也可以分散在周围文本中。请进一步注意,不允许使用空格,因此foo = "bar"
将不匹配。
答案 1 :(得分:2)
您正在匹配表单的字符串:
富= '酒吧'
或
巴兹= “BLAT”
(\ w +)匹配一个或多个单词字符。 (字符是a到z,A到Z和下划线。)
=匹配文字等号。
[\'“]匹配单引号或双引号。
(。*)匹配任何字符序列零次或多次。
\ 2是一个转义\ 2,在regexp中匹配第二个匹配。在这种情况下,您的第二场比赛是单引号或双引号。使用\ 2确保引号匹配,您可以在字符串中使用其他引用样式。
答案 2 :(得分:1)
我要把它分成几块。
#
这将打开正则表达式字符串。
(\w+)
这匹配并捕获一个或多个单词字符,这是一个大写字母和小写字母,以及下划线。它在看到=符号时停止。
=
匹配文字=符号。
([\'"])
匹配并捕获'字符或'字符。
(.*)\\2
匹配并捕获除\ n之外的任何字符,直到最后一次出现“\ 2”,“\”仅匹配1 \字符。
#
这将关闭正则表达式字符串。
U
这是匹配字符串的参数,我相信这意味着将其匹配为UTF-8字符串。我不太熟悉PHP如何处理这个问题;所以其他人可能会成为更好的权威。
这将捕获3个匹配并将它们放入名为$ matches的数组中,并按照它们匹配的顺序。
那应该对你有帮助。
答案 3 :(得分:1)
此正则表达式可能用于获取名称由一个或多个单词字符(\w+
)组成的名称/值对,后跟一个等号(=
),后跟一个带引号的字符串,用单引号或双引号括起来(['"]
)。其余的((.*)\2
)仅用于获取引号之间的所有内容,而\2
确保匹配正确的引号(与第二个subpattern中匹配的引用相同)。由于使用了U modifier,所有quantifiers都不情愿,因此它们只能尽可能少地匹配。