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

问题描述 投票:0回答:14

我正在尝试提取子字符串。我需要一些用 PHP 来做这件事的帮助。

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

home/cat1/subcat2 => home

test/cat2 => test

startpage => startpage

我想获取字符串直到第一个

/
,但如果不存在
/
,则获取整个字符串。

我试过了,

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

我认为它说的是 - 获取

/
的位置,然后获取从位置 0 到 that 位置的子字符串。

我不知道如何处理没有

/
的情况,而又不让声明太大。

有没有办法在不使 PHP 语句过于复杂的情况下处理这种情况?

php string substring
14个回答
413
投票

最有效的解决方案是

strtok
函数:

strtok($mystring, '/')

注意:如果要分割的字符超过一个,结果可能无法满足您的期望,例如

strtok("somethingtosplit", "to")
返回
s
,因为它被第二个参数中的任何单个字符分割(在本例中使用
o
)。

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

例如:

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

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

305
投票

使用

explode()

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

在本例中,我将

limit
参数用于
explode
,以便 php 不会扫描超出需要的字符串。


103
投票
$first = explode("/", $string)[0];

22
投票

这个怎么样:

$result = substr($mystring.'/', 0, strpos($mystring, '/'));

只需在 mystring 末尾添加一个 '/' 即可确保至少有一个 ;)


14
投票

迟到总比不到好。 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', '/')
);

13
投票

已接受答案的单行版本:

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

应该在 php 5.4+ 中工作


9
投票

这可能是我想到的最短的例子:

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

1)

list()
将自动分配字符串,直到
"/"
如果找到分隔符
2) 如果未找到分隔符
"/"
,则将分配整个字符串

...如果您真的很注重性能,您可以添加额外的参数来爆炸

explode("/", $mystring, 2)
,这会限制返回元素的最大值。


6
投票

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

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

有时,正则表达式速度较慢,因此如果性能是一个问题,请确保正确对其进行基准测试,并使用其他带有子字符串的替代方案(如果它更适合您)。


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

虽然我还没有测试过,但这应该可以正常工作..而且速度也很快


4
投票

current
上使用
explode
可以简化该过程。

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

3
投票

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

/**
 * 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

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

这个方法比

strtok
更好更准确 因为如果你想获取 @ 之前的值 虽然@之前没有字符串,但它会告诉您符号之后的内容。 但
explode
没有


-1
投票
$string="kalion/home/public_html";

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

-1
投票

为什么不使用:

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);
   }
© www.soinside.com 2019 - 2024. All rights reserved.