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

shi*_*hin 4 regex

我是正则表达式的菜鸟.

我希望有人能解释#(\ w +)=([\'"])(.*)\ 2#U中发生了什么.

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

提前致谢.

Ant*_*sky 8

让我们一块一块地分开.首先,请注意preg_match_all在其正则表达式周围采用分隔符,因此#s与任何内容都不匹配,但U重要的是:它是一个使匹配"ungreedy"的修饰符.这意味着,而不是匹配的越好,所有的量词(?,*,+,{,})会匹配越好.然后,一块一块:

  1. (\w+):\w匹配"单词字符" - 字母数字或下划线; 所述+匹配的一个或多个的这些; 并且括号将其分组并将其存储在第一个捕获组中,可以使用该组进行访问\1.
  2. =:匹配文字=.非常简单 :)
  3. ([\'"]):方括号引入了一个字符类,这是一种说"匹配任何这些字符"的简写方式.这里,字符类是['"],但由于它是单引号字符串,因此'必须进行转义.因此,这匹配a '或a ",并将结果存储在可以访问的第二个捕获组中\2.这是此特定正则表达式的唯一相关捕获组.
  4. (.*):.匹配任何非换行符,并*匹配任何数字(零或更多).这就是U改性剂很重要的原因!没有它,这将始终匹配到线的末端; 有了它,它将匹配,直到下一个匹配.请注意,因为它在括号中,所以它位于第三个捕获组中,可以通过\3(令人震惊的)访问它.
  5. \\2:如果我们不必逃避反斜杠,那只会是\2:第二个捕获组的内容.在这种情况下,它是我们在第3步中匹配的报价.

把这一切放在一起,这个正则表达式粗略地说是一个变量名(步骤1),后跟一个等号(步骤2),后跟一个字符串(步骤3-5); 对于其原因\2是,这样的正则表达式不匹配"string',并为理由U修改是,这样foo="string" bar="strung"将返回两场比赛中foo="string"bar="strung"(同\1foobar,和\3stringstrung),而不是单一的,贪婪的比赛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"
Run Code Online (Sandbox Code Playgroud)

只要每个实体本身在一条线上,这些实体就可以分散在整个字符串中,在同一条线上或不同的线上,在周围的文本中.请注意,不允许使用空格,因此foo = "bar"不匹配.