※ ChatGPTを利用し、要約された質問です(原文:文字列の中の特定部分とそうでない部分とで処理を分けたい)
特定部分の処理と文字列の結合方法について
このQ&Aのポイント
文字列の中の特定部分とそうでない部分とで処理を分ける方法と、処理した結果を文字列として結合する方法について教えてください。
例えば、<test>で囲まれた部分は小文字に変換し、囲まれていない部分は大文字に変換したい場合、どのようにすれば良いでしょうか。
現在、preg_match_all()とpreg_replace()を使用して処理を行っていますが、よりスマートな方法があれば教えてください。
文字列の中の特定部分とそうでない部分とで処理を分けたい
文字列中で、<test>~</test>で囲まれた部分と、囲まれてない部分とで処理を分けたいです。
そして、分けて処理したあとに、くっつけたいです。
abcdEFG
<test>
ABCDEFG
</test>
hiJKLmn
↓ 例えば、<test>で囲まれた部分は小文字に変換、囲まれていない部分は大文字に変換という処理であれば以下のようにしたいのです。
ABCDEFG
<test>
abcdefg
</test>
HIJKLMN
扱う文字列は、UTF-8で複数行です。
自分でとりあえず動作するコードは作成してはみたものの、、、
あまりスマートとはいえないと感じていて、もっといい方法があればご教示お願いしたいです。。。
1.文字列Aの中から、<test>で囲まれた部分をpreg_match_all()で取得し、変数Aに格納。
2.変数Aに処理を加え、変数Bに代入。
3.preg_replace()で文字列Aの中の、変数A部分を変数Bに置換。
4.文字列Aを、<test>で囲まれた部分をキーとしてpreg_split()で分解し、変数Aに格納。
5.変数Aに処理を加え、変数Bに代入。
6.preg_replace()で文字列Aの中の、変数A部分を変数Bに置換。
$pre1 = array();
$pre2 = array();
preg_match_all("/<test>((.|\r\n|\n)*?)<\/test>/u", $p_string, $pre1);
for ( $x = 0; $x < count($pre1[0]); $x++ ) {
# $pre1[0]ではなく$pre1[1]としてるのは<test>タグを含めないため
$pre2[$x] = $pre1[1][$x];
# hoge*()は処理
$pre2[$x] = hoge2( $pre2[$x] );
$pre2[$x] = hoge4( $pre2[$x] );
# <test>タグを戻して、置換後の文字列完成・・・(1)
$pre2[$x] = '<test>'.$pre2[$x].'</test>';
# 置換パターン・・・(2)
$pre1[0][$x] = "/" . preg_quote($pre1[0][$x], "/") . "/u";
}
# 文字列から、(2)置換パターンを探して、(1)置換後文字列に置き換え
$p_string = preg_replace( $pre1[0], $pre2, $p_string );
$pre1 = array();
$pre2 = array();
$pre1 = preg_split("/<test>(.|\r\n|\n)*?<\/test>/u", $p_string, -1, PREG_SPLIT_NO_EMPTY);
for ( $x = 0; $x < count($pre1); $x++ ) {
$pre2[$x] = $pre1[$x];
# hoge*()は処理
$pre2[$x] = hoge1( $pre2[$x] );
$pre2[$x] = hoge2( $pre2[$x] );
$pre2[$x] = hoge3( $pre2[$x] );
# 置換後の文字列完成・・・(3)
$pre2[$x] = hoge4( $pre2[$x] );
# 置換パターン・・・(4)
$pre1[$x] = "/" . preg_quote($pre1[$x], "/") . "/u";
}
# 文字列から、(4)置換パターンを探して、(3)置換後文字列に置き換え
$p_string = preg_replace( $pre1, $pre2, $p_string );
# 最後に<test>タグを削除する
$p_string = preg_replace( "/<test>((.|\r\n|\n)*?)<\/test>/u", $1, $p_string );
お礼
ありがとうございました。 ソース、参考にさせて頂きました。 速度的にもstrpos→substrで切り出した方が速いようで、助かりました。 また、細かく文字列を切り分けてから、それぞれに処理を加えられるので参考になりました。 ※実際に切り取った文字列に加える処理は、大文字小文字の変換だけでなく、 指定範囲内には処理1と3を、範囲外には2と3と4のようにしていたので、 一度文字列を切り出して、処理を終えたら合体という流れにする必要がありました。 例に出したのがわかりづらくて申し訳ありませんでした