web-dev-qa-db-ja.com

PHP substr特定の文字の後、substr + strposエレガントなソリューション?

いくつかの針文字'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'が見つからない場合、strposFALSEを返します(JSのような-1ではありません)。 FALSEはゼロと評価され、最初の文字は常に切り捨てられます。

おかげで、

17
Marco Demaio

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

しかし、 strstr を使用することもできます:

strstr($str, 'x')

ただし、これはwithxで始まる部分文字列を返すため、substrを使用してxの後の部分を取得します。

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

しかし、これははるかに複雑です。したがって、代わりにstrposアプローチを使用してください。

12
Gumbo

正規表現を使用すると、よりエレガントになります。

// 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);
5
Alix Axel

私はこれだけが必要で、楽しみのためにそれを1行に保つように努力してこれを思い付きました:

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

ternary operatorは5.3でこれが機能するように調整されました。

PHP 5.3であるため、三項演算子の中間部分を省略することが可能です。式expr1?:expr3は、expr1がTRUEと評価された場合はexpr1を返し、そうでない場合はexpr3を返します。

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

0
William George
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);
0