PHP substr在某个字符之后,是substr+;strpos优雅解决方案?

PHP substr在某个字符之后,是substr+;strpos优雅解决方案?,php,substr,strpos,Php,Substr,Strpos,假设我想从以下位置返回一些针字符'x'之后的所有字符: $source\u str=“Tuex helo babe” 通常我会这样做: if( ($x_pos = strpos($source_str, 'x')) !== FALSE ) $source_str = substr($source_str, $x_pos + 1); 你知道更好/更聪明(更优雅)的方法吗? 如果不使用regexp,它将不会变得更优雅,也可能会更慢 不幸的是,我们不能做到: $source_str = sub

假设我想从以下位置返回一些针字符
'x'
之后的所有字符:

$source\u str=“Tuex helo babe”

通常我会这样做:

if( ($x_pos = strpos($source_str, 'x')) !== FALSE )
   $source_str = substr($source_str, $x_pos + 1);
你知道更好/更聪明(更优雅)的方法吗?

如果不使用regexp,它将不会变得更优雅,也可能会更慢

不幸的是,我们不能做到:

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


谢谢,

您的第一种方法很好:检查
x
是否包含在
strpos
中,如果包含,请使用
substr
获取任何信息

但你也可以使用:

但由于返回以
x
开头的子字符串,请使用
substr
获取
x
之后的部分:

if (($tmp = strstr($str, 'x')) !== false) {
    $str = substr($tmp, 1);
}
但这要复杂得多。因此,请改用您的
strpos
方法

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

正则表达式将使其更加优雅:

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

$item
的末尾追加一个“-”,这样它总是在“-”之前返回字符串,即使
$item
不包含“-”,因为strpos默认情况下返回第一次出现“-”的位置


我需要的就是这个,为了好玩,我努力让它保持在一条线上,我想到了这个:

ltrim(strstrstr($source\u str,$needle=“x”)?:$source\u str,$needle)

在5.3中对
三元运算符
进行了调整,使其能够工作

由于PHP5.3,可以省略三元运算符的中间部分。表达式expr1?:如果expr1的计算结果为真,则expr3返回expr1,否则返回expr3


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

但如果未找到指针,strstrstr返回FALSE,而不是整个字符串。从PHP 5.3+strstrstr()接受可选的第三个参数“before_needle”,该参数允许包含或排除指针。因此,无需再使用substr。这将包括$source_str中的'x',多谢您的回答,但值得商榷的是,这更优雅,而且肯定更慢“如果您只想确定某个特定的指针是否出现在haystack中,请改用更快、内存占用更少的函数strps()[来源:我很困惑。
strps
用于检查子字符串的出现情况,并在我的回答中使用。
strstrstr
用于返回字符串的一部分,仅当子字符串出现时才返回。我发现它更优雅,因为它不需要辅助变量,
if()
行,它比较短。它唯一的缺陷是@adam提到的抱歉,我可能没有正确解释自己,我认为使用strps+strstrstr比使用strps+substr慢。我没有测试性能(所以我不确定,但速度差异可能不明显),但除此之外,它仍然是两行带有if的代码(与我问题中的代码非常相似),我希望有人能给出一个更简洁的解决方案。使用第一种方法。你能删除“!==FALSE”吗这样会更紧凑一些?@Gumbo,恐怕你是对的。请把它写下来作为答案,我选择你的答案,除非有更好的答案。你可以用“intval”将假值强制为0:$source\u str=substr($source\u str,intval(strpos($source\u str,'x'))+1)@patrick:为什么我要强制FALSE为0?FALSE已经被PHP转换为0。我有点喜欢这种方法,为什么它不好?我认为它节省了一个计算周期。。。
// 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);
substr($item,0,strpos($item.'-','-'))