2
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] = scheme m[2] = user m[3] = pass m[4] = host m[5] = port m[6] =路径 m[7] = 查询字符串 m[8] = 片段

它运行良好,除非 queryString 包含数组,例如: ?ar[k1]=v1&ar[k2]=v2

我的问题是: 1. 正则表达式中锐利 # 的含义是什么 2.如何修改正则表达式以使其匹配 queryString 包含数组

4

4 回答 4

3

您最好使用parse_url, 捕获查询字符串,然后您可以使用它parse_str来获取键 - > 值对数组。

于 2012-07-01T14:42:06.337 回答
2

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

scheme://username:password@domain:port/path?query_string #fragment_id

2.解析一个 URL并返回它的组件

于 2012-07-01T15:00:27.720 回答
2

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

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

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

于 2012-07-01T14:41:03.950 回答
1

这个正则表达式似乎非常严格地根据RFC 3986调整 URI 的语法,这实际上不允许纯文本[查询]内部:

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

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

… (?:\\?([0-9a-zA-Z!$&\'()*@+,:;=._~%[\]-]*))? …
于 2012-07-01T15:24:30.637 回答