正则表达式匹配查询字符串包括数组

时间:2012-07-01 14:38:39

标签: php regex

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));

上面的正则表达式用于匹配网址,结果应该是 m [1] = scheme m [2] = user m [3] = pass m [4] = host m [5] = port m [6] = path m [7] = queryString m [8] = fragment

除了queryString包含数组外,它运行良好 例如: ?AR [K1] = V1&安培; AR [K2] = V2

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

4 个答案:

答案 0 :(得分:3)

您最好使用parse_url,同时捕获查询字符串,然后您可以使用parse_str获取密钥数组 - >价值对。

答案 1 :(得分:2)

改为使用parse_strhttp://php.net/manual/en/function.parse-str.php

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

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

答案 2 :(得分:2)

1.正则表达式中的尖锐(#2nd)意味着URL

的一部分

方案://用户名:密码@域名:端口/路径QUERY_STRING # fragment_id

2. Parse a URL并返回其组件

答案 3 :(得分:1)

这个正则表达式似乎非常严格地根据RFC 3986调整URI的语法,实际上不允许query内的普通[]:< / p>

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

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

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