質問: preg_replace_callback('/<("[^"]*"|\'[^\']*\'|[^>])*>[ ]?/', "test_call", $data); var_dump($data); ?>
回答: まず,$matches0]に何が入っているのかを確認しましょう. print_r($matches); $matches[0]には,マッチした文字列全体が入ります. インデックスが1以上のところには()で括った部分にマッチした物が順に入ります. <("[^"]*"|\'[^\']*\'|[^>])*>[ ]? のような正規表現だと, hogedesu[_hogenanodesu (_は,半角スペースだと思ってください. に対して,下のようにマッチします. $matches[0] = [_ $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);