特定の範囲のみの置き換え方法No.25884
cent さん 08/12/21 06:37
 
お世話になります。

置き換えについて教えてください。

特定の範囲内の
特定文字の
置き換えになります。

例えば
<a href=>aaa bbb ccc</a><div>aaa bbb ddd</div>

<a href=>aaa&nbsp;bbb&nbsp;ccc</a><div>aaa bbb ddd</div>
に置き換える。

<a>と</a>の範囲の
半角spaceだけを&nbsp;に
置き換えるには
どうしたらよろしいでしょうか?

<a></a>が<title></title>等に
代わることもあります。

よろしくお願いいたします。


[ ]
RE:25884 特定の範囲のみの置き換え方法No.25885
山紫水明 さん 08/12/21 17:20
 
 centさん,

>例えば
><a href=>aaa bbb ccc</a><div>aaa bbb ddd</div>
>を
><a href=>aaa&nbsp;bbb&nbsp;ccc</a><div>aaa bbb ddd</div>
>に置き換える。

 この例であれば,
検索語:(?<=<a href=>)([^ ]+) ([^ ]+) ([^ ]+)(?=</a>)
置換語:\\1&nbsp;\\2&nbsp;\\3
正規表現
でできるでしょう。マクロでは
replaceallfast "(?<=<a href=>)([^ ]+) ([^ ]+) ([^ ]+)(?=</a>)",
 "\\1&nbsp;\\2&nbsp;\\3", regular;
となります。

 スペースの数が3つある場合もあれば,
replaceallfast "(?<=<a href=>)([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+)(?=</a>)",
 "\\1&nbsp;\\2&nbsp;\\3&nbsp;\\4", regular;
を追加します。

 以下のように書けば置換語や検索語が変わる場合,最初の2行を書きかえれば
できます。
$begin = "<a href=>";
$end = "</a>";
replaceallfast "(?<=" + $begin + ")([^ ]+) ([^ ]+) ([^ ]+)(?=" + $end + ")",
 "\\1&nbsp;\\2&nbsp;\\3", regular;
replaceallfast "(?<=" + $begin + ")([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+)(?="
 + $end + ")", "\\1&nbsp;\\2&nbsp;\\3&nbsp;\\4", regular;

 さらに汎用的にするには別の書き方もあります。

     では, (^^)/~
                                        山紫水明(ユーザー)
                                        SANSHISUIMEI

[ ]
RE:25884 特定の範囲のみの置き換え方法No.25886
encodingshiftjis さん 08/12/21 17:32
 
細かく改行した HTMLを準備するのが 簡単です
この場合に限らず、テキスト処理では。
範囲置換も行単位なら できます。

このままベタなテキストでは

(>.*?) (.*?</a)

\1&nbsp;\2

 を 置換回数が0になるまで 全置換 繰り返し

[ ]
RE:25886 特定の範囲のみの置き換え方法No.25887
cent さん 08/12/22 02:22
 
山紫水明 さん
encodingshiftjis さん

いつも的確で暖かなご指導ありがとうございます。
おかげさまで解決できました。完璧でした。

切り出して変換する発想が欠けておりました。

今後ともよろしくお願いいたします。

[ ]