我正在尝试提取子字符串.在PHP中我需要一些帮助.
以下是我正在使用的一些示例字符串以及我需要的结果:
home/cat1/subcat2 => home
test/cat2 => test
startpage => startpage
Run Code Online (Sandbox Code Playgroud)
我希望得到字符串直到第一个/,但如果没有/,请获取整个字符串.
我试过了,
substr($mystring, 0, strpos($mystring, '/'))
Run Code Online (Sandbox Code Playgroud)
我认为它说 - 获取位置,/然后从位置0到该位置获取子串.
我不知道如何处理没有的情况/,没有使声明太大.
有没有办法处理这种情况,而不会使PHP语句太复杂?
jma*_*eli 256
在最有效的解决方案是strtok功能:
strtok($mystring, '/')
Run Code Online (Sandbox Code Playgroud)
例如:
$mystring = 'home/cat1/subcat2/';
$first = strtok($mystring, '/');
echo $first; // home
Run Code Online (Sandbox Code Playgroud)
和
$mystring = 'home';
$first = strtok($mystring, '/');
echo $first; // home
Run Code Online (Sandbox Code Playgroud)
gnu*_*nud 235
使用 explode()
$arr = explode("/", $string, 2);
$first = $arr[0];
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我正在使用limit参数,explode以便php不会扫描字符串,而不是需要的.
小智 94
$first = explode("/", $string)[0];
Run Code Online (Sandbox Code Playgroud)
小智 11
那这个呢 :
substr($mystring.'/', 0, strpos($mystring, '/'))
Run Code Online (Sandbox Code Playgroud)
只需在mystring的末尾添加一个'/',这样你就可以确定至少有一个;)
接受答案的单行版本:
$out=explode("/", $mystring, 2)[0];
Run Code Online (Sandbox Code Playgroud)
应该在php 5.4+中工作
这可能是我想到的最短的例子:
list($first) = explode("/", $mystring);
Run Code Online (Sandbox Code Playgroud)
1)list()将自动分配字符串,直到"/"找到分隔符
2)如果"/"未找到分隔符,则将分配整个字符串
...如果你真的痴迷于性能,你可以添加额外的参数来爆炸explode("/", $mystring, 2),这限制了返回元素的最大值.
迟到总比没有好。php为此具有预定义的功能。这是个好方法。
strstr
Run Code Online (Sandbox Code Playgroud)
如果您想在比赛之前获得零件,只需将before_needle(第3个参数)设置为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', '/')
);
Run Code Online (Sandbox Code Playgroud)
小智 5
您可以尝试使用这样的正则表达式:
$s = preg_replace('|/.*$|', '', $s);
Run Code Online (Sandbox Code Playgroud)
有时,正则表达式虽然较慢,但如果性能是一个问题,请确保对其进行适当的基准测试,并使用其他更适合您的子字符串替代方案。
小智 5
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 );
}
}
Run Code Online (Sandbox Code Playgroud)
我没有测试它,但这应该工作得很好..而且它也很快