我试图提取一个子字符串。我需要一些帮助,在PHP做它。

以下是我正在使用的一些示例字符串和我需要的结果:

home/cat1/subcat2 => home

test/cat2 => test

startpage => startpage

我想获取第一个/之前的字符串,但如果没有/,则获取整个字符串。

我试过了,

substr($mystring, 0, strpos($mystring, '/'))

我想它说的是-获取/的位置然后获取从0到那个位置的子字符串。

我不知道如何处理没有/的情况,而不使声明太大。

有没有一种方法来处理这种情况,也不使PHP语句过于复杂?


当前回答

最有效的解决方案是strtok函数:

strtok($mystring, '/')

注意:如果有多个字符要分割,结果可能不符合您的期望,例如strtok("somethingtosplit", "to")返回s,因为它被第二个参数的任何单个字符分割(在这种情况下使用o)。

@friek108感谢你在评论中指出这一点。

例如:

$mystring = 'home/cat1/subcat2/';
$first = strtok($mystring, '/');
echo $first; // home

and

$mystring = 'home';
$first = strtok($mystring, '/');
echo $first; // home

其他回答

PHP 5.3中的函数strstr()应该完成这项工作。第三个参数应该设置为true..

但是如果你没有使用5.3,那么下面的函数应该可以准确地工作:

function strbstr( $str, $char, $start=0 ){
    if ( isset($str[ $start ]) && $str[$start]!=$char ){
        return $str[$start].strbstr( $str, $char, $start+1 );
    }
}

我还没有测试它,但这应该工作得很好..而且速度也很快

$string="kalion/home/public_html";

$newstring=( stristr($string,"/")==FALSE ) ? $string : substr($string,0,stripos($string,"/"));

最有效的解决方案是strtok函数:

strtok($mystring, '/')

注意:如果有多个字符要分割,结果可能不符合您的期望,例如strtok("somethingtosplit", "to")返回s,因为它被第二个参数的任何单个字符分割(在这种情况下使用o)。

@friek108感谢你在评论中指出这一点。

例如:

$mystring = 'home/cat1/subcat2/';
$first = strtok($mystring, '/');
echo $first; // home

and

$mystring = 'home';
$first = strtok($mystring, '/');
echo $first; // home

这可能是我想到的最短的例子:

list($first) = explode("/", $mystring);

1) list()将自动分配字符串,直到找到“/”分隔符 2)如果没有找到分隔符“/”,那么将分配整个字符串

...如果你真的痴迷于性能,你可以添加额外的参数爆炸爆炸("/",$mystring, 2)限制最大返回的元素。

公认答案的单行版本:

$out=explode("/", $mystring, 2)[0];

应该工作在php 5.4+