【问题标题】:Why am I getting empty results in my RegExp?为什么我的 RegExp 中的结果为空?
【发布时间】:2009-07-27 08:45:05
【问题描述】:

我正在尝试使用此 RegExp 将我的 URL 解析为不同的部分:

([\w\\.-]*)

给定一个示例 URL http://www.foo.com/bar/baz 我从 preg_match_all() 得到这些结果:

Array
(
[0] => Array
    (
        [0] => http
        [1] => 
        [2] => 
        [3] => 
        [4] => www.foo.com
        [5] => 
        [6] => bar
        [7] => 
        [8] => baz
        [9] => 
    )

)

它似乎将任何无效字符解析为一个空项。
我该如何解决?

【问题讨论】:

  • 你也可以试试 parse_url 函数。
  • 它不适合 URI。我正在实现一个 RESTful 分配机制。

标签: php regex preg-match-all


【解决方案1】:

通过使用*,您正在捕获空组 - 请改用+

([\w\.-]+)

我假设你的 RE 中额外的 \ 是因为你把它放在一个带引号的字符串中。

【讨论】:

  • 重新解释 \... 如果是这样,为什么没有一个 \w ?
  • +1 * 将匹配前面表达式的任何计数(包括 0),而 + 是“1 或更多”
  • +1:使用*时,字符类会匹配0次或多次。这意味着即使字符类失败,表达式也会匹配一个空字符串。这就是为什么://http 之后匹配为三个空字符串。
  • 它通过推进一个字符来避免匹配空字符串后的无限循环。
【解决方案2】:

这可以做你想做的:([\w.-]+|.) 这将匹配地址的所有部分。

【讨论】:

  • 我认为他想要做的就是匹配任何包含一个或多个字母、句点或破折号的字符串。所以适当的正则表达式是:([\w.-]+) 添加|. 将阻止字符串为空(它们将是":""/""/" 等),但它们仍然会存在。跨度>
  • 他想把 html 分解成几部分......这就是我读到的。
  • 是的,虽然他说空字符串用于“无效字符”,但我认为他不希望将它们包含在匹配列表中。
  • 另一个结论可能是他想要的只是域名。
  • 不,因为它也匹配目录名称。
【解决方案3】:

你确定要\\.

换句话说,从您发布的内容来看,您似乎逃脱了反斜杠,而不是您可能打算的句点。编辑:为了整洁,删除多余的转义并没有什么坏处,但这不是实际问题[正如 blixt 所指出的——谢谢]。

强烈推荐 The Regulator 作为正则表达式调试工具 [虽然它基于 .NET 正则表达式,因此不适合 PHP 工作 - 但一般来说,有一些工具可以让您识别运行匹配的基础]

仍然不明白您想要使用范围内的反斜杠做什么。您可以发布您在问题中使用的最终正则表达式吗?很抱歉这个答案让您分心!

编辑:正如 blixt 指出的那样,句号不像我建议的那样充当元字符。

【讨论】:

  • 是的,这可能是问题所在。
  • 你确定它在括号内这样做吗?
猜你喜欢
  • 2019-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-05
  • 2017-07-05
  • 1970-01-01
相关资源
最近更新 更多