文字列の中の特定部分とそうでない部分とで処理を分けたい
文字列中で、<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 );
お礼
できました! ありがとうございました。