【问题标题】:PHP Regex : several stopping characters with Positive lookbehindPHP 正则表达式:几个带有正面后视的停止字符
【发布时间】:2012-03-16 12:17:52
【问题描述】:

你好 stackoverflow 社区!
我正在尝试在 PHP 中使用基于 Positive lookbehind 的简单正则表达式。我的目标是提取 URL 中域名和一组特定字符(?或 & 或 /)之间的所有内容。我想在这些例子中提取“bar”:

  • foo.com/bar?
  • foo.com/bar&
  • foo.com/bar/

我试过了

(?<=foo\.com\/)[^/?&]+  

它在the plateform test 中运行良好 但不适用于 PHP 5.3x preg_match :抛出的错误是我不能使用多个停止字符 - 它适用于一个。

我还尝试了积极的后向/前瞻组合,但问题仍然存在。 我做错了什么?

【问题讨论】:

  • 您是否将正则表达式包含在分隔符内?你能告诉我们你的代码吗?
  • @M42 确定!这是:preg_match("/(?&lt;=foo\.com\/)[^/?&amp;]+/", "http://www.foo.com/bar?", $result);
  • 您需要转义所有斜杠:/(?&lt;=foo\.com\/)[^\/?&amp;]+/,包括字符类中的斜杠。
  • 嗬!谢谢你的反应 42 先生!

标签: php regex lookbehind


【解决方案1】:

在 PHP 中,与(比如说)JavaScript 不同,您不能在不转义的情况下使用正则表达式分隔符,即使在字符类中。所以,你需要改变这个:

"/(?<=foo\.com\/)[^/?&]+/"

到这里:

"/(?<=foo\.com\/)[^\/?&]+/"

【讨论】:

    【解决方案2】:

    转义斜线:

    preg_match("/(?<=foo\.com\/)[^\/?&]+/", "http://www.foo.com/bar?", $result);
                          here ___^
    

    或使用其他分隔符

    preg_match("#(?<=foo\.com/)[^/?&]+#", "http://www.foo.com/bar?", $result);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-30
      • 1970-01-01
      • 2014-09-28
      • 2016-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多