PHP子字符串提取。获取第一个'/'或者整个字符串

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

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

home/cat1/subcat2 => home


test/cat2 => test


startpage => startpage

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

我试过了,

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

我认为它说的是-获取/的位置,然后获取从位置0到位置的子字符串。

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

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

369584 次浏览

使用explode()

$arr = explode("/", $string, 2);
$first = $arr[0];

在本例中,我使用limit参数来explode,以便php只扫描所需的字符串。

你可以尝试使用这样的正则表达式:

$s = preg_replace('|/.*$|', '', $s);

有时候,正则表达式比较慢,所以如果性能是一个问题,请确保正确地进行基准测试,如果更适合您,请使用其他带有子字符串的替代方法。

$string="kalion/home/public_html";


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

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 );
}
}

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

那么这个呢:

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

简单地添加一个'/'到mystring的末尾,这样你就可以确保至少有一个;)

$first = explode("/", $string)[0];

explode上使用current可以简化这个过程。

 $str = current(explode("/", $str, 2));

为什么不使用:

function getwhatiwant($s)
{
$delimiter='/';
$x=strstr($s,$delimiter,true);
return ($x?$x:$s);
}

或者:

   function getwhatiwant($s)
{
$delimiter='/';
$t=explode($delimiter, $s);
return ($t[1]?$t[0]:$s);
}

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

strtok($mystring, '/')

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

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

例如:

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

而且

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

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

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

1)如果找到分隔符,list()将自动分配字符串直到"/" 2)如果没有找到分隔符__abc0,则整个字符串将被赋值为

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

迟到总比不到好。PHP有一个预定义的函数。这是一个好方法。

strstr

如果你想在匹配之前获得部分,只需将before_needle(第3个参数)设置为true http://php.net/manual/en/function.strstr.php < / p >

function not_strtok($string, $delimiter)
{
$buffer = strstr($string, $delimiter, true);


if (false === $buffer) {
return $string;
}


return $buffer;
}


var_dump(
not_strtok('st/art/page', '/')
);

你可以创建一个helper函数来处理这个问题:

/**
* Return string before needle if it exists.
*
* @param string $str
* @param mixed $needle
* @return string
*/
function str_before($str, $needle)
{
$pos = strpos($str, $needle);


return ($pos !== false) ? substr($str, 0, $pos) : $str;
}

下面是一个用例:

$sing = 'My name is Luka. I live on the second floor.';


echo str_before($sing, '.'); // My name is Luka

公认答案的单行版本:

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

应该工作在php 5.4+