#(\ w +)=([\'“])(。*)\\ 2#U是什么意思?

时间:2010-12-13 21:30:52

标签: regex

我是正则表达式的菜鸟。

我希望有人可以解释#(\ w +)=([\'“])(。*)\ 2#U中发生了什么。

preg_match_all('#(\w+)=([\'"])(.*)\\2#U', $str, $matches);

提前致谢。

4 个答案:

答案 0 :(得分:8)

让我们一块一块地分开。首先,请注意preg_match_all围绕其正则表达式使用分隔符,因此#与任何内容都不匹配,但U非常重要:it's a modifier which makes the match "ungreedy"。这意味着,所有量词(?*+{,})都匹配,而不是匹配为很多尽可能。然后,一块一块地:

  1. (\w+)\w匹配“单词字符” - 字母数字或下划线; +匹配其中一个或多个;并且括号将其分组并将其存储在第一个捕获组中,可以使用\1进行访问。
  2. =:匹配文字=。很简单:)
  3. ([\'"]):方括号引入了一个字符类,这是一种说“匹配任何这些字符”的简写方式。在这里,字符类是['"],但由于它是单引号字符串,因此'必须进行转义。因此,这匹配'",并将结果存储在第二个捕获组中,可以使用\2进行访问。这是此特定正则表达式的唯一相关捕获组。
  4. (.*).匹配任何非换行符,*匹配任意数字(零或更多)。这就是U修饰符很重要的原因!没有它,这将始终匹配到线的末端;有了它,它将匹配,直到下一个匹配。请注意,因为它在括号中,所以它位于第三个捕获组中,可以使用\3进行访问(令人震惊)。
  5. \\2:如果我们不必逃避反斜杠,那么这只是\2:第二个捕获组的内容。在这种情况下,它是我们在步骤3中匹配的任何一个引用。
  6. 总而言之,这个正则表达式大致相当于一个变量名称(步骤1),后跟一个等号(步骤2),后跟一个字符串(步骤3-5); \2的原因是正则表达式与"string'不匹配,U修饰符的原因是foo="string" bar="strung"将返回foo="string"的两个匹配项{1}}和bar="strung"\1foobar\3stringstrung),而不是foo="string" bar="strung"的单一,贪婪匹配(\1foo\3string" 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都不情愿,因此它们只能尽可能少地匹配。