プロが教える店舗&オフィスのセキュリティ対策術

例えば「zwed_fgrty_abcde_h」の場合、「_」が2回目に出現する位置以降の文字列を取得したい。

取得したい結果
abcde_h

A 回答 (7件)

$str = 'zwed_fgrty_abcde_h';


$i = strpos($str, '_');
$i = strpos($str, '_', $i+1);
echo substr($str, $i+1);
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
期待した結果を取得できました

お礼日時:2019/12/29 07:56

preg_match('/^(?:[^_]*_){2}(.+)$/', 'zwed_fgrty_abcde_h', $matches);


echo $matches[1];
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
期待した結果を取得できましたが、正規表現部分が難しかったです。
・^ … 先頭が
・(?:[^_]*_) … キャプチャ
・[^_]*_ … 先頭が_で開始するもの以外の全ての後に_が続くもの
・先頭が_で開始するもの以外の全ての後に_が続くものを2回キャプチャして、(.+)している

お礼日時:2019/12/29 08:02

echo implode('_' ,array_slice(explode('_' ,'zwed_fgrty_abcde_h')

    • good
    • 0
この回答へのお礼

回答ありがとうございました

お礼日時:2019/12/29 08:03

行末のセミコロン抜けちゃってましたね



echo implode('_' ,array_slice(explode('_' ,'zwed_fgrty_abcde_h') ,2));
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
期待した結果を取得できました。
'_'を区切り文字として配列にした後、処理しているのですね。
この発想はなかったので、大変参考になりました

お礼日時:2019/12/29 08:09

それぞれの回答者さんの書かれた処理、質問者さんの「zwed_fgrty_abcde_h」を渡した場合の結果は同じですが、


「abc_def」みたいに「_」の数が2個に満たない文字列を渡した時の挙動はそれぞれ違って面白いですね。

No.3の方の回答、PCブラウザで見ると確かに行末付近が欠けてるんですが、スマホアプリで見るとちゃんと最後まで表示されています。
教えて!goo側のバグですね。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

>「abc_def」みたいに「_」の数が2個に満たない文字列を渡した時の挙動
・なるほど、その可能性を考慮していませんでした
・バグを生み出す元になっていたかもしれません
・大変参考になりました

お礼日時:2019/12/29 08:12

もう少し簡潔にならないか考えてみましたが、こんな書き方もできますね。



echo @explode('_', 'zwed_fgrty_abcde_h', 3)[2];

「@」を使うのに抵抗があれば、

$arr = explode('_', 'zwed_fgrty_abcde_h', 3);
echo isset($arr[2]) ? $arr[2] : '';

等でもいいでしょう。
    • good
    • 1
この回答へのお礼

回答ありがとうございました。

>echo @explode('_', 'zwed_fgrty_abcde_h', 3)[2];
・@使用している理由は何ですか?
・@使用したことがないため理由が分からないのですが、エラー表示しないためですか?

お礼日時:2019/12/29 08:16

「@」はエラー制御演算子というもので、本来ならWarningやNoticeとなるような場合でも、これを付けておくことでそれを無視できます。



> echo @explode('_', 'zwed_fgrty_abcde_h', 3)[2];

この例の場合、与える文字列が 'zwed_fgrty_abcde_h' ならば問題ないのですが、'zwed_fgrty' や 'zwed' のような「_」が2個に満たない文字列だった場合、添字の[2]に当たるデータが無いため、本来なら
Notice: Undefined offset: 2
が出るのですが、「@」を付けることでこれが無視され、何事もなかったようにNULLが返されます。

結果が分かった上で使う分にはいいのですが、無闇に使うと致命的なエラーが発生していたとしても気付きにくくなるため、「原因は分からないけれどWarningが出るのでとりあえず@を付けて対処」というような使い方はしないほうがよいのです。
    • good
    • 0
この回答へのお礼

詳細解説ありがとうございました。
良く分かりました。

>結果が分かった上で使う分にはいい
>「原因は分からないけれどWarningが出るのでとりあえず@を付けて対処」というような使い方はしないほうがよい
・なるほど。考え方が、大変参考になりました

お礼日時:2019/12/30 08:48

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!