1

我有来自循环函数的这些类型的结果,

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/

4

6 回答 6

2

您的代码将如下所示:

$sData   = 'C:/wamp/www/xxx/local/page/';
$sResult = preg_replace('/^(.*?)\/(core|local)\/(.*?)$/', '$2/$3', $sData); 
于 2013-09-17T11:39:15.013 回答
1

使用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/");

于 2013-09-17T11:46:15.543 回答
1

你可以preg_replace这样使用:

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

或者

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

如果你想严格匹配文件夹coreor local,你可以使用这个:

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

Viper-7 演示


对于你的问题:

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

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

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

于 2013-09-17T11:40:02.093 回答
0

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

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

它只会修剪左侧的字符串。

于 2013-09-17T11:51:31.930 回答
0
$output = substr($string, strpos($string,'local/')+strpos($string,'core/'));
于 2013-09-17T11:39:52.437 回答
-5
preg_replace('/.*(core|local)/', "$1", $string);
于 2013-09-17T12:01:00.547 回答