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!$&''()*@+,:;=._~%[']-]*))? …