• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:文字列の中の特定部分とそうでない部分とで処理を分けたい)

特定部分の処理と文字列の結合方法について

このQ&Aのポイント
  • 文字列の中の特定部分とそうでない部分とで処理を分ける方法と、処理した結果を文字列として結合する方法について教えてください。
  • 例えば、<test>で囲まれた部分は小文字に変換し、囲まれていない部分は大文字に変換したい場合、どのようにすれば良いでしょうか。
  • 現在、preg_match_all()とpreg_replace()を使用して処理を行っていますが、よりスマートな方法があれば教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • nicolish
  • ベストアンサー率72% (13/18)
回答No.3

preg_matchを使う流れに反逆してstrposだけで書いてみた。整理すればもう少し可読性が上がるかもしれない。読みづらい分、速度はかなり出るはず。 やってる事は ・<test>の前までは大文字に変換 ・<test>をそのままくっつける ・次の</test>までは小文字に変換 ・</test>をそのままくっつける ・残りの部分に対し、ここまでの処理を繰り返し

karace
質問者

お礼

ありがとうございました。 ソース、参考にさせて頂きました。 速度的にもstrpos→substrで切り出した方が速いようで、助かりました。 また、細かく文字列を切り分けてから、それぞれに処理を加えられるので参考になりました。 ※実際に切り取った文字列に加える処理は、大文字小文字の変換だけでなく、 指定範囲内には処理1と3を、範囲外には2と3と4のようにしていたので、 一度文字列を切り出して、処理を終えたら合体という流れにする必要がありました。 例に出したのがわかりづらくて申し訳ありませんでした

その他の回答 (2)

  • mpx
  • ベストアンサー率71% (149/209)
回答No.2

このような方法も有ります <?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]);} ?>

karace
質問者

お礼

ありがとうございます。 ただ、例に出したのがわかりづらかったでしょうか。 実際に切り取った文字列に加える処理は、大文字小文字の変換だけでなく、 指定範囲内には処理1と3を、範囲外には2と3と4のようにしていたので、 一度文字列を切り出して、処理を終えたら合体という流れにする必要がありました。 回答頂いたのに申し訳ありません。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

どこまで厳密にやりたいかによりますが、ざっくり手を抜いてやると こんな感じ <? $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; ?>

karace
質問者

お礼

ありがとうございます。 ただ、例に出したのがわかりづらかったでしょうか。 実際に切り取った文字列に加える処理は、大文字小文字の変換だけでなく、 指定範囲内には処理1と3を、範囲外には2と3と4のようにしていたので、 一度文字列を切り出して、処理を終えたら合体という流れにする必要がありました。 回答頂いたのに申し訳ありません。

関連するQ&A