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

'x'見つからない場合はstrpos戻りますFALSE-1JSの場合とは異なります)。 FALSEはゼロと評価され、1番目の文字は常に切り捨てられます。

ありがとう、

4

5 に答える 5

13

最初のアプローチは問題ありません。xが含まれているかどうかを確認し、含まれstrposている場合は、の後に何かを取得しsubstrます。

しかし、あなたも使うことができますstrstr

strstr($str, 'x')

ただし、これは。で始まる部分文字列を返すため 次の部分を取得するためxに使用します。substrx

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 operatorが機能するように、5.3で適応されました。

PHP 5.3以降、三項演算子の中央部分を省略できます。式expr1?:expr3は、expr1がTRUEと評価された場合はexpr1を返し、それ以外の場合はexpr3を返します。

NB。ltrim文字列の先頭で一致する複数の文字をトリミングします。

于 2015-01-07T16:28:10.900 に答える
-1

strposはデフォルトで「-」の最初の出現位置を返すため、最後に「-」を追加して、「- $item」の前に常に文字列を返します。$item

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