用于匹配查询的正则表达式包括数组


regular expression to match querysting includes array

preg_match(#(?:([a-zA-Z-]+):)?(?://(?:([a-zA-Z0-9_!$&''()*+,;=._~%-]+)(?::([a-zA-Z0-9_!$&''()*+,;=._~%-]*))?@)?([a-zA-Z0-9-._]+)(?::([0-9]*))?)?([a-zA-Z0-9_!$&''()*@+,:;=._~/%-]*)(?:''?([0-9a-zA-Z!$&''()*@+,:;=._~%-]*))?(?:''#(.*))?#, $uri, $m));

上面的正则表达式用于匹配 URL,结果应该是m[1

] = 方案 m[2] = 用户 m[3] = 传递 m[4] = 主机 m[5] = 端口 m[6] = 路径 m[7] = 查询字符串 m[8] = 片段

它工作得很好,除非查询字符串包含数组,例如:?ar[k1]=v1&ar[k2]=v2

我的问题是:1.正则表达式中尖锐#的含义是什么2.如何修改正则表达式以使其与查询字符串包含数组匹配

最好使用 parse_url ,也可以捕获查询字符串,然后可以将其与 parse_str 一起使用以获取键 -> 值对数组。

1.正则表达式中的尖锐(#2nd)表示URL的一部分

方案:/

/用户名:password@domain:端口/路径?query_string # fragment_id

2.解析 URL 并返回其组件

改用parse_str:http://php.net/manual/en/function.parse-str.php

这完全符合您的要求并且是内置的,最重要的是,没有正则表达式(看看那个怪物):s。

顺便说一下,直接回答你的问题,#只是正则表达式的分隔符。

这个正则表达式似乎非常严格地适应了 RFC 3986 的 URI 语法,这实际上不允许在查询中使用纯[]

  query       = *( pchar / "/" / "?" )
  pchar       = unreserved / pct-encoded / sub-delims / ":" / "@"
  unreserved  = ALPHA / DIGIT / "-" / "." / "_" / "~"
  pct-encoded = "%" HEXDIG HEXDIG
  sub-delims  = "!" / "$" / "&" / "'" / "(" / ")"
              / "*" / "+" / "," / ";" / "="

现在,如果您也想允许这些字符,请将它用于现有正则表达式中的查询部分:

… (?:''?([0-9a-zA-Z!$&''()*@+,:;=._~%[']-]*))? …