PHP子字符串提取。在第一个'/'或整个字符串之前获取字符串

时间:2009-12-20 14:07:02

标签: php string substring

我正在尝试提取子字符串。我在PHP中需要一些帮助。

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

home/cat1/subcat2 => home

test/cat2 => test

startpage => startpage

我希望字符串直到第一个/,但如果没有/,则获取整个字符串。

我试过了,

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

我认为它说 - 获取/的位置,然后从位置0到 位置获取子串。

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

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

15 个答案:

答案 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)

使用explode()

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