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