PHP substr经过一定的char,一个substr + strpos优雅的解决方案?

时间:2010-10-27 17:41:15

标签: php substr strpos

假设我希望在来自:

的一些针char [{1}}之后返回所有字符

'x'

通常我会这样做:

$source_str = "Tuex helo babe"

你知道更好/更聪明(更优雅的方式)吗?

不使用不会使它更优雅且可能也更慢的正则表达式。

不幸的是我们做不到:

if( ($x_pos = strpos($source_str, 'x')) !== FALSE )
   $source_str = substr($source_str, $x_pos + 1);

因为找不到$source_str = substr(source_str, strpos(source_str, 'x') + 1); 'x'会返回strpos(而不是JS中的FALSE)。 -1将评估为零,并且第一个字符将始终被切断。

谢谢,

5 个答案:

答案 0 :(得分:11)

您的第一种方法很好:检查x是否包含strpos,如果是,请substr获取任何内容。

但您也可以使用strstr

strstr($str, 'x')

但是,当它返回开头 x的子字符串时,请使用substr获取x之后的部分:

if (($tmp = strstr($str, 'x')) !== false) {
    $str = substr($tmp, 1);
}

但这要复杂得多。因此,请改用strpos方法。

答案 1 :(得分:4)

正则表达式会让它变得更加优雅:

// helo babe
echo preg_replace('~.*?x~', '', $str);

// Tuex helo babe
echo preg_replace('~.*?y~', '', $str);

但你总是可以尝试这个:

// helo babe
echo str_replace(substr($str, 0, strpos($str, 'x')) . 'x', '', $str);

// Tuex helo babe
echo str_replace(substr($str, 0, strpos($str, 'y')) . 'y', '', $str);

答案 2 :(得分:0)

if(strpos($source_str, 'x') !== FALSE )
   $source_str = strstr($source_str, 'x');

不太优雅,但开头没有x

if(strpos($source_str, 'x') !== FALSE )
   $source_str = substr(strstr($source_str, 'x'),1);

答案 3 :(得分:0)

我需要这个,并努力将它保持在一条线上以获得乐趣:

ltrim(strstr($source_str, $needle = "x") ?: $source_str, $needle);

ternary operator在5.3中进行了调整,以实现这一目标。

  

从PHP 5.3开始,可以省略三元运算符的中间部分。表达式expr1?:expr3如果expr1的计算结果为TRUE则返回expr1,否则返回expr3。

NB。 ltrim将修剪字符串开头的多个匹配字符。

答案 4 :(得分:-1)

附加' - '在$item的末尾,所以它始终在' - '之前返回字符串。即使$item也不包含' - ',因为默认情况下,strpos会返回' - '的第一次出现的位置

substr($item,0,strpos($item.'-','-'))