【问题标题】:PHP: How to trim off everything before certain keywords in strings?PHP:如何修剪字符串中某些关键字之前的所有内容?
【发布时间】:2013-09-17 11:34:11
【问题描述】:

我从循环函数中得到这些类型的结果,

C:/wamp/www/xxx/core/page/
C:/wamp/www/xxx/local/page/

但是我怎样才能在 corelocal 之前剪掉任何东西,所以我只得到这些,

core/page/
local/page/

我使用strstr,但我认为它只搜索一个固定的关键字,我有两个,更多的关键字要匹配,

$string = 'C:/wamp/www/xxx/local/page/';
$output = strstr($string, '(local|core)');
var_dump($output);

我试过preg_replace

var_dump(preg_replace('#/(core|local)/.*#si', '/', $string));

它给了我前面的部分 - C:/wamp/www/xxx/

【问题讨论】:

    标签: php regex preg-replace strstr php-5.4


    【解决方案1】:

    你的代码会是这样的:

    $sData   = 'C:/wamp/www/xxx/local/page/';
    $sResult = preg_replace('/^(.*?)\/(core|local)\/(.*?)$/', '$2/$3', $sData); 
    

    【讨论】:

      【解决方案2】:

      你可以像这样使用preg_replace

      $output = preg_replace('~^.*?((?:core|local).*$)~i', "$1", $string);
      

      $output = preg_replace('~^.*?(?=core|local)~i', '', $string);
      

      如果要严格匹配文件夹corelocal,可以使用这个:

      $output = preg_replace('~^.*?/(?=(?:core|local)/)~i', '', $string);
      

      Viper-7 demo


      你的问题:

      var_dump(preg_replace('#/(core|local)/.*#si', '/', $string));
      

      这将匹配 /(core|local)/.* 并将其替换为 /,这并不是您真正想要的,因为您实际上必须匹配之前的内容。我在这里的第一个正则表达式就是一个例子:它将匹配(?:core|local) 之前的所有内容,然后捕获之后进入捕获组的所有内容,我在使用反向引用$1 时指的是。

      好吧,因为这里的投票战......我在比赛中添加了正斜杠,如果你根本不使用捕获组(但使用前瞻),你将使用更少的内存,因此我是如何得出最后一个正则表达式的。

      【讨论】:

      • 反向引用看起来更好,谢谢,我忘了他们
      • 这并不过分复杂。这实际上是使用preg_replace 的最简单方法,避免了过多的捕获。
      【解决方案3】:

      使用preg_match()

      <?
          $dir = "C:/wamp/www/xxx/core/page/";
          preg_match("#^.*?/((?:local|core).*/)$#i",$dir,$match);
          echo $match[1];
      ?>
      

      如果字符串的第一位始终相同,您可以使用
      echo ltrim($dir, "C:/wamp/www/xxx/");

      【讨论】:

        【解决方案4】:
        $output = substr($string, strpos($string,'local/')+strpos($string,'core/'));
        

        【讨论】:

        • 实际上,不是 - 因为会用C:/wamp/www/xxx/score/page/做这些事情
        • 天啊$output = substr($string, strpos($string,'/local/')+strpos($string,'/core/')+strpos($string,'/score/')+1);
        • 如果$string = 'C:/wamplocal/www/xxx/local/page/';,这将失败。您应该找到/local/ 的位置,而不仅仅是local/
        • @Jerry 该死的:p 我知道我错过了一些东西,但这对我来说太愚蠢了:p 非常感谢
        【解决方案5】:

        您可以使用 str_replace 以不同的方式执行此操作。检查下面。

        $string = 'C:/wamp/www/xxx/local/page/';
        $output = str_replace('C:/wamp/www/xxx/' , '' , $string);
        var_dump($output);
        

        它只会剪掉左边的字符串。

        【讨论】:

        • 我确定 wwwxxx 是示例字符串,可以是 any 字符...所以 str_replace 在这里不起作用.
        【解决方案6】:
        preg_replace('/.*(core|local)/', "$1", $string);
        

        【讨论】:

        • 取决于你如何看待它。如果您认为有必要,请添加/,但不要在琐事上浪费我的时间。
        • 该正则表达式也会因C:/wamp/www/xxx/local/page/local/file 而失败。不常见,但也不是不可能。
        猜你喜欢
        • 1970-01-01
        • 2010-12-23
        • 2017-09-12
        • 2012-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-17
        相关资源
        最近更新 更多