- ベストアンサー
特定部分の処理と文字列の結合方法について
- 文字列の中の特定部分とそうでない部分とで処理を分ける方法と、処理した結果を文字列として結合する方法について教えてください。
- 例えば、<test>で囲まれた部分は小文字に変換し、囲まれていない部分は大文字に変換したい場合、どのようにすれば良いでしょうか。
- 現在、preg_match_all()とpreg_replace()を使用して処理を行っていますが、よりスマートな方法があれば教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
preg_matchを使う流れに反逆してstrposだけで書いてみた。整理すればもう少し可読性が上がるかもしれない。読みづらい分、速度はかなり出るはず。 やってる事は ・<test>の前までは大文字に変換 ・<test>をそのままくっつける ・次の</test>までは小文字に変換 ・</test>をそのままくっつける ・残りの部分に対し、ここまでの処理を繰り返し
その他の回答 (2)
- mpx
- ベストアンサー率71% (149/209)
このような方法も有ります <?PHP $txt=<<<_EOF_ abcdEFG <test> ABCDEFG </test> hiJKLmn _EOF_; $TXT=strtoupper($txt); $TxT=preg_replace_callback("|(<TEST>\n)(.*?)(</TEST>\n)|sm", "str2Low",$TXT); echo $TxT; function str2Low($x){return strtolower($x[2]);} ?>
お礼
ありがとうございます。 ただ、例に出したのがわかりづらかったでしょうか。 実際に切り取った文字列に加える処理は、大文字小文字の変換だけでなく、 指定範囲内には処理1と3を、範囲外には2と3と4のようにしていたので、 一度文字列を切り出して、処理を終えたら合体という流れにする必要がありました。 回答頂いたのに申し訳ありません。
- yambejp
- ベストアンサー率51% (3827/7415)
どこまで厳密にやりたいかによりますが、ざっくり手を抜いてやると こんな感じ <? $str=<<<eof aBcD <test> EfgH </test> iJKl <test> MnOp </test> QRst eof; $patterns=Array( '/.*/es' ,'/(<test>)(.*?)(<\/test>)/ies' ); $replacements=Array( "strtoupper('\\0')" ,"'\\1'.strtolower('\\2').'\\3'" ); $str=preg_replace($patterns,$replacements,$str); print $str; ?>
お礼
ありがとうございます。 ただ、例に出したのがわかりづらかったでしょうか。 実際に切り取った文字列に加える処理は、大文字小文字の変換だけでなく、 指定範囲内には処理1と3を、範囲外には2と3と4のようにしていたので、 一度文字列を切り出して、処理を終えたら合体という流れにする必要がありました。 回答頂いたのに申し訳ありません。
お礼
ありがとうございました。 ソース、参考にさせて頂きました。 速度的にもstrpos→substrで切り出した方が速いようで、助かりました。 また、細かく文字列を切り分けてから、それぞれに処理を加えられるので参考になりました。 ※実際に切り取った文字列に加える処理は、大文字小文字の変換だけでなく、 指定範囲内には処理1と3を、範囲外には2と3と4のようにしていたので、 一度文字列を切り出して、処理を終えたら合体という流れにする必要がありました。 例に出したのがわかりづらくて申し訳ありませんでした