PHP的子串提取。 在第一个“/”或整个string之前获取string

我正在尝试提取一个子string。 我需要在PHP中做一些帮助。

以下是我正在使用的一些示例string以及我需要的结果:

home/cat1/subcat2 => home test/cat2 => test startpage => startpage 

我想得到string,直到第一个/ ,但如果不存在,获取整个string。

我试过了,

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

我认为它说 – 获得/的位置,然后从位置0到位置的子string。

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

有没有办法处理这种情况也没有使PHP语句太复杂?

使用explode()

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

在这种情况下,我使用limit参数来explode以便PHP不会扫描string。

最有效的解决scheme是strtok函数:

 strtok($mystring, '/') 

例如:

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

 $mystring = 'home'; $first = strtok($mystring, '/'); echo $first; // home 
 $first = explode("/", $string)[0]; 

那这个呢 :

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

只需在mystring的末尾添加一个“/”,以确保至less有一个;)

这可能是我脑海中最短的一个例子:

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

1)如果发现分隔符, list()将自动分配string直到"/"
2)如果分隔符"/"没有find,那么整个string将被分配

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

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

我还没有testing过,但这应该工作得很好..而且速度也非常快

接受答案的单行版本:

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

应该在PHP 5.4 +工作

迟到比从未好。 PHP有一个预定义的function。 这是好方法。

 strstr 

如果你想在比赛之前得到部分只是设置before_needle (第三个参数)为true http://php.net/manual/en/function.strstr.php

 function not_strtok($string, $delimiter) { $buffer = strstr($string, $delimiter, true); if (false === $buffer) { return $string; } return $buffer; } var_dump( not_strtok('st/art/page', '/') ); 

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

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

有时候,正则expression式会比较慢,所以如果性能是一个问题,那么一定要正确地对这个基准进行基准testing,如果它更适合你,可以使用其他的替代方法。

使用current explode将缓解过程。

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

你可以创build一个辅助函数来处理这个问题:

 /** * 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 
 $string="kalion/home/public_html"; $newstring=( stristr($string,"/")==FALSE ) ? $string : substr($string,0,stripos($string,"/")); 

我认为这应该工作?

 substr($mystring, 0, (($pos = (strpos($mystring, '/') !== false)) ? $pos : strlen($mystring))); 

为什么不使用:

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