• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:正規表現でpreg_系を使ってタグ内は置き換えないようにする方法)

正規表現でタグ内のスペースを置き換えずにする方法

このQ&Aのポイント
  • 正規表現でpreg_系を使って、タグ内の半角スペースを に置き換えたいが、タグ内のスペースも置き換わってしまう問題がある。
  • タグ内を置き換えないためにはどのような方法を取るべきか。
  • 提供されたコードでは、タグ内のスペースも置き換わるため、タグでないものを置き換える方法が必要である。

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

  • ベストアンサー
  • aigaion
  • ベストアンサー率47% (287/608)
回答No.1

まず,$matches[0]に何が入っているのかを確認しましょう. print_r($matches); $matches[0]には,マッチした文字列全体が入ります. インデックスが1以上のところには()で括った部分にマッチした物が順に入ります. <("[^"]*"|\'[^\']*\'|[^>])*>[ ]? のような正規表現だと, hogedesu<A href = "hoge.html">_hogenanodesu (_は,半角スペースだと思ってください. に対して,下のようにマッチします. $matches[0] = <A href = "hoge.html">_ $matches[1] = "hoge.html" タグの中の()の部分はダブルクォートで囲まれた部分にマッチするみたいですね. 全体としては,タグの前の部分にマッチしませんし,タグの後の部分についても スペースが1つだけにマッチし,そのあとはマッチしません. これだと困るので,下のようにします. ([^<>]*)(<[^>]+>)([^<>]*) $matches[0] = $data; $matches[1] = タグの前で<か>が見つかるまでの部分; $matches[2] = タグ; $matches[3] = タグの後で<か>が見つかるまでの部分; タグを判別する条件が,<>だけなのでタグ以外で<>が使われていたら破綻します. その辺りはうまくやってくださいね. function test_call($matches){ return str_replace(" ","&nbsp;",$matches[1]) . $matches[2] .str_replace(" ","&nbsp;",$matches[3]); } $data = preg_replace_callback('/([^<>]*)(<[^>]+>)([^<>]*)/', "test_call", $data);

関連するQ&A