我是一个正则表达式的新手。
我希望有人能解释一下 #(\w+)=([\'"])(.*)\2#U 这段代码的含义。
preg_match_all('#(\w+)=([\'"])(.*)\\2#U', $str, $matches);
提前致谢。
我是一个正则表达式的新手。
我希望有人能解释一下 #(\w+)=([\'"])(.*)\2#U 这段代码的含义。
preg_match_all('#(\w+)=([\'"])(.*)\\2#U', $str, $matches);
提前致谢。
preg_match_all
在正则表达式周围有定界符,所以 #
不匹配任何内容,但是 U
很重要:它是一个使匹配 "不贪心" 的修饰符。这意味着与其尽可能匹配,所有的量词(?
、*
、+
、{,}
)都会尽可能少地匹配。然后,逐个解释:
(\w+)
: \w
匹配“单词字符”——字母数字或下划线;+
匹配一个或多个这样的字符;圆括号将其分组并将其存储在第一个捕获组中,可以使用 \1
访问该组。=
:匹配文字 =
。非常简单 :)([\'"])
:方括号引入了一个字符类,这是一种简写方式,用于表示“匹配其中任何一个字符”。这里,字符类是 ['"]
,但由于它是一个单引号字符串,因此必须转义 '
。因此,这将匹配一个 '
或一个 "
,并将结果存储在第二个捕获组中,可以使用 \2
访问该组。这是此特定正则表达式中唯一相关的捕获组。(.*)
:点号匹配任何非换行符字符,*
匹配任意数量(零个或多个)的它们。这就是为什么 U
修饰符很重要!如果没有它,这将一直匹配到行尾;有了它,它将匹配到下一个匹配项。请注意,由于它在括号内,因此它在第三个捕获组中,可以使用 \3
访问该组(令人震惊)。\\2
:如果我们不必转义反斜杠,那么这将只是 \2
:第二个捕获组的内容。在这种情况下,它是我们在步骤 3 中匹配的引号之一。将所有内容综合起来,这个正则表达式大致匹配一个变量名(第一步)后跟着等号(第二步),再跟着一个字符串(第3-5步);\2
的原因是为了避免正则表达式匹配到"string'
,而U
修改器的原因是为了使foo="string" bar="strung"
返回两个匹配项foo="string"
和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"
不会匹配。
#
这将打开正则表达式字符串。
(\w+)
这个匹配并捕获1个或多个单词字符,包括A到Z的大写和小写字母以及下划线。它遇到等号符号停止。
=
匹配一个等号符号。
([\'"])
匹配并捕获单引号或双引号字符。
(.*)\\2
匹配并捕获除 \n 外的任何字符,直到 "\2" 的最后一次出现,"\ "仅匹配一个 \ 字符。
#
这个语句结束了正则表达式字符串。
U
这是一个匹配字符串的参数,我相信它意味着将其作为UTF-8字符串进行匹配。我对PHP如何处理此事不太熟悉,因此其他人可能更有权威性。
这将捕获3个匹配项并将它们放入一个名为$matches的数组中,按照它们被匹配的顺序排列。
希望这能帮到您。