18

假设我想在一些针字符后返回所有字符'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);

因为 when 'x'is not foundstrpos返回FALSE(而-1不像在 JS 中那样)。 FALSE将评估为零,并且第一个字符将始终被切断。

谢谢,

4

5 回答 5

13

您的第一种方法很好:检查是否x包含 with strpos,如果是,则在它之后获取任何内容substr

但你也可以使用strstr

strstr($str, 'x')

但由于这会返回以 开头的子字符串 x因此请使用以下内容substr获取部分x

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

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

于 2010-10-27T17:45:13.907 回答
5

正则表达式会使它更加优雅:

// 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);
于 2010-10-27T20:37:00.083 回答
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);
于 2010-10-27T17:45:58.397 回答
0

我只需要这个,并为了好玩而努力将其保持在一条线上,然后想出了这个:

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

ternary operator5.3 中对其进行了调整以使其正常工作。

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

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

于 2015-01-07T16:28:10.900 回答
-1

在末尾附加一个“-”,$item因此它总是在“-”之前返回字符串,甚至$item不包含“-”,因为 strpos 默认返回“-”第一次出现的位置

substr($item,0,strpos($item.'-','-'))
于 2014-08-25T10:14:29.893 回答