【问题标题】:How do I stop a Regular Expression when I reach a certain character in PHP?当我到达 PHP 中的某个字符时,如何停止正则表达式?
【发布时间】:2013-03-23 02:36:05
【问题描述】:

我有一个字符串,/controller/method/parameter1/parameter2?parameter1=parameter2。这只是我用于我的网站的REQUEST_URI。

我想使用 PHP 将该字符串拆分为单独的数组元素,以下代码可以很好地执行此操作:preg_split('[/]', $_SERVER['REQUEST_URI'], NULL, PREG_SPLIT_NO_EMPTY)。

这几乎完美无缺,为我提供了出色的数组输出,直到我添加了 get 变量。有了这些,最后一个数组元素也包含了 get 变量。

我的问题是,有没有办法在达到问号 (?) 时立即停止处理?

我想从问号中删除它,只显示问号之前的项目。这(希望)意味着:

Array
(
    [0] => controller
    [1] => method
    [2] => parameter1
    [3] => parameter2?parameter1=parameter2
)

会变成这样:

Array
(
    [0] => controller
    [1] => method
    [2] => parameter1
    [3] => parameter2
)

问题是,我希望这一切都在正则表达式中。我真的不在乎是否有其他方法(我知道有),我只想知道在正则表达式中是否有办法做到这一点。

谢谢

【问题讨论】:

    标签: php regex url url-rewriting rewrite


    【解决方案1】:

    先分解再分解

    $vars = explode('?', $_SERVER['REQUEST_URI']);
    
    $array = preg_split('[/]', $vars[0], NULL, PREG_SPLIT_NO_EMPTY);
    

    更新

    来自php.net:

    如果你不需要正则表达式的威力,你可以选择 更快(虽然更简单)的替代方案,例如 explode() 或 str_split()。

    在您的情况下,您可以使用 str_split 并节省一些时间。

    【讨论】:

      【解决方案2】:

      你可以替换 ?(.*) 使用:

      preg_split('[/]', 
      preg_replace("/\?(.*)/", "", $_SERVER['REQUEST_URI']), 
      NULL, PREG_SPLIT_NO_EMPTY)
      

      【讨论】:

        【解决方案3】:

        在使用正则表达式之前,我在我的系统中使用 strpos 和 substr 执行此操作:

        $uri = $_SERVER['REQUEST_URI'];
        $uri = ($pos = strpos($uri, '?')) ? substr($uri, 0, $pos) : $uri;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-11-24
          • 2018-11-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多