- ベストアンサー
正規表現でタグ内のスペースを置き換えずにする方法
- 正規表現でpreg_系を使って、タグ内の半角スペースを に置き換えたいが、タグ内のスペースも置き換わってしまう問題がある。
- タグ内を置き換えないためにはどのような方法を取るべきか。
- 提供されたコードでは、タグ内のスペースも置き換わるため、タグでないものを置き換える方法が必要である。
- みんなの回答 (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(" "," ",$matches[1]) . $matches[2] .str_replace(" "," ",$matches[3]); } $data = preg_replace_callback('/([^<>]*)(<[^>]+>)([^<>]*)/', "test_call", $data);