次のような文字列があります。
Security/Flow_Setup/Steady_State/Verification
最初の 2 つのレベル (例: Security/Flow_Setup ) だけが必要です。これを取得する簡単な方法はありますか? 現在、区切り文字として '/' を使用して文字列を配列に分解し、要素 0 と 1 をつなぎ合わせています。
これは機能しますが、よりエレガントなソリューションを望んでいました。
何かご意見は?
次のような文字列があります。
Security/Flow_Setup/Steady_State/Verification
最初の 2 つのレベル (例: Security/Flow_Setup ) だけが必要です。これを取得する簡単な方法はありますか? 現在、区切り文字として '/' を使用して文字列を配列に分解し、要素 0 と 1 をつなぎ合わせています。
これは機能しますが、よりエレガントなソリューションを望んでいました。
何かご意見は?
最初の2つの部分だけが必要な場合は、これよりもエレガント/短くなりすぎることはないと思います。
list($var1, $var2) = explode('/', $str);
ここでは正規表現はまったく不要です。
コメントdirname
で言及された誰かが、賢くておそらく適切なアイデアであり、非常に短くて読みやすいと思いました(そして、上記のコードのような2つの別々の部分の代わりに必要な文字列を取得します):
$str = 'Security/Flow_Setup/Steady_State/Verification';
echo dirname(dirname($str));
// Output: Security/Flow_Setup
私はあなたがすべてうまくやっていると信じています。必要に応じて、次の方法で試すことができます。
$str = "Security/Flow_Setup/Steady_State/Verification";
echo substr($str, 0, strpos($str, '/', strpos($str, '/') + 1));
(配列は関係ありません。少し速くなるはずです)
典型的な使用法でも文字列関数でもありませんが、文字列は事実上パスであるため、おそらくこれで十分です...
dirname(dirname('Security/Flow_Setup/Steady_State/Verification'));
これが、私が思いつくことができる最も短くて最も効率的なワンライナーです。
$firstTwoParts = implode('/', array_slice(explode('/', $str, 3), 0, 2));
これは、必要なパーツの数を制御できる関数にラップできます。
function first_n_parts ($str, $n, $delimiter = '/') {
return ($n = (int) $n) ? implode($delimiter, array_slice(explode($delimiter, $str, $n + 1), 0, $n)) : '';
}
...だからできること:
echo first_n_parts($str, 1); // Security
echo first_n_parts($str, 2); // Security/Flow_Setup
echo first_n_parts($str, 3); // Security/Flow_Setup/Steady_State
この正規表現はそれを行う必要があります
'/^([a-zA-Z]+\/[a-zA-Z]+)?/'