いくつかの針文字'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
を返します(JSのような-1
ではありません)。 FALSE
はゼロと評価され、最初の文字は常に切り捨てられます。
おかげで、
最初のアプローチは問題ありません。x
がstrpos
に含まれているかどうかを確認し、含まれている場合はsubstr
を使用してその後に何かを取得します。
しかし、 strstr
を使用することもできます:
strstr($str, 'x')
ただし、これはwithx
で始まる部分文字列を返すため、substr
を使用してx
の後の部分を取得します。
if (($tmp = strstr($str, 'x')) !== false) {
$str = substr($tmp, 1);
}
しかし、これははるかに複雑です。したがって、代わりにstrpos
アプローチを使用してください。
正規表現を使用すると、よりエレガントになります。
// 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);
私はこれだけが必要で、楽しみのためにそれを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
は、文字列の先頭にある複数の一致する文字をトリミングします。
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);