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

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

home/cat1/subcat2 => home

test/cat2 => test

startpage => startpage

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

我试过了,

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

我想它说的是-获取/的位置然后获取从0到那个位置的子字符串。

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

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


当前回答

$string="kalion/home/public_html";

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

其他回答

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

strtok($mystring, '/')

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

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

例如:

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

and

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

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

strstr

如果你想获得匹配前的部分,只需将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', '/')
);

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

这种方法比strtok更好、更准确 因为如果你想获取@之前的值 虽然@之前没有字符串,但它会在符号之后给你什么。 但是爆炸不

使用爆炸()

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

在本例中,我使用limit参数来爆炸,这样php就不会扫描字符串,只扫描所需的部分。

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

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

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