PHP:如何在字符串中的某些关键字之前删除所有内容?

时间:2013-09-17 11:34:12

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

我从循环函数

获得这些类型的结果
C:/wamp/www/xxx/core/page/
C:/wamp/www/xxx/local/page/

但是如何在核心本地之前删除任何内容,所以我只能获得这些,

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/

6 个答案:

答案 0 :(得分:2)

您的代码将如下:

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

答案 1 :(得分:1)

您可以像这样使用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时将其引用。

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

答案 2 :(得分: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/");

答案 3 :(得分:0)

$output = substr($string, strpos($string,'local/')+strpos($string,'core/'));

答案 4 :(得分:0)

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

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

它只会修剪左侧的弦。

答案 5 :(得分:-4)

preg_replace('/.*(core|local)/', "$1", $string);