【最大10000ポイント】当たる!!質問投稿キャンペーン!

正規表現でpreg_系を使って、半角スペースをに置き換える処理をしたのですが、タグ内のスペースも&nbs;に置き換わってしましました。
タグ内は置き換えないようにするにはどのようにしたら良いでしょうか?

データは複数行渡っています。以下はタグが置き換わるので、逆にタグでないものを置き換えたいです。

<?php

function test_call($matches){
return str_replace(" ","",$matches[0]);
}

$data = <<< EOT
この横は変換 します。
<a href="http://www.yahoo.co.jp/" target="_blank">タグの半角スペースは変換せず、 この横は変換する。 </a>
このタグも変換してはいけません。< br/>
EOT;


$data = preg_replace_callback('/<("[^"]*"|\'[^\']*\'|[^>])*>[ ]?/', "test_call", $data);


var_dump($data);

?>

このQ&Aに関連する最新のQ&A

A 回答 (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);
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング