我正在尝试提取子字符串。我在PHP中需要一些帮助。
以下是我正在使用的一些示例字符串以及我需要的结果:
home/cat1/subcat2 => home
test/cat2 => test
startpage => startpage
我希望字符串直到第一个/
,但如果没有/
,则获取整个字符串。
我试过了,
substr($mystring, 0, strpos($mystring, '/'))
我认为它说 - 获取/
的位置,然后从位置0到 位置获取子串。
我不知道如何处理没有/
的情况,而不会使声明太大。
有没有办法处理这种情况而不会使PHP语句过于复杂?
答案 0 :(得分:235)
效率最高的解决方案是strtok
功能:
strtok($mystring, '/')
例如:
$mystring = 'home/cat1/subcat2/';
$first = strtok($mystring, '/');
echo $first; // home
和
$mystring = 'home';
$first = strtok($mystring, '/');
echo $first; // home
答案 1 :(得分:221)
$arr = explode("/", $string, 2);
$first = $arr[0];
在这种情况下,我使用limit
参数explode
,这样php就不会扫描字符串了。
答案 2 :(得分:94)
$first = explode("/", $string)[0];
答案 3 :(得分:10)
这个怎么样:
substr($mystring.'/', 0, strpos($mystring, '/'))
只需在mystring的末尾添加一个'/',这样你就可以确定至少有一个;)
答案 4 :(得分:8)
这可能是我脑海中最短的例子:
list($first) = explode("/", $mystring);
1)如果找到分隔符,list()
将自动分配字符串直到"/"
2)如果未找到分隔符"/"
,则将分配整个字符串
...如果你真的痴迷于性能,你可以添加额外的参数来爆炸explode("/", $mystring, 2)
,这限制了返回元素的最大值。
答案 5 :(得分:8)
接受答案的单行版本:
$out=explode("/", $mystring, 2)[0];
应该在php 5.4 +
中工作答案 6 :(得分: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 );
}
}
我还没有测试过,但这应该可以正常工作..而且它也很快
答案 7 :(得分:4)
迟到总比没有好。 php有一个预定义的功能。这是好方法。
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', '/')
);
答案 8 :(得分:2)
您可以尝试使用这样的正则表达式:
$s = preg_replace('|/.*$|', '', $s);
有时候,正则表达式虽然速度较慢,但如果性能问题,请确保正确地对此进行基准测试,如果它更适合您,请使用带有子串的其他替代方法。
答案 9 :(得分:2)
在current
上使用explode
可以简化此过程。
$str = current(explode("/", $str, 2));
答案 10 :(得分:2)
您可以创建一个辅助函数来处理:
/**
* 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
答案 11 :(得分:1)
您也可以使用这一解决方案
list($substring) = explode("/", $string);
答案 12 :(得分:0)
$string="kalion/home/public_html";
$newstring=( stristr($string,"/")==FALSE ) ? $string : substr($string,0,stripos($string,"/"));
答案 13 :(得分:-1)
我认为这应该有用吗?
substr($mystring, 0, (($pos = (strpos($mystring, '/') !== false)) ? $pos : strlen($mystring)));
答案 14 :(得分:-1)
为什么不使用:
function getwhatiwant($s)
{
$delimiter='/';
$x=strstr($s,$delimiter,true);
return ($x?$x:$s);
}
OR:
function getwhatiwant($s)
{
$delimiter='/';
$t=explode($delimiter, $s);
return ($t[1]?$t[0]:$s);
}