引用文の色を変えるのに /g が使えません。

[上に] [前に] [次に]
じぇい 1999/06/14(月) 04:00:21
引用文の色を変えようと思って、

$f_msg =~ s/(^|<BR>)((&gt;|>).+?)(<BR>|$)/$1<font color=\"#6a5acd\">$2<\/font>$4/g;

としたのですが、これでは、一度引用文の終わりのしるしである<BR>までマッチしたら、次は<BR>を飛ばしてマッチングを開始するので、
たとえば、

>テスト
>テスト

と、2回続けて>を使った場合に、はじめの>テストの色だけが変わり、2行目の>テストの色が変わりません。それで、現在

while($f_msg =~ s/(^|<BR>)((&gt;|>).+?)(<BR>|$)/$1<font color=\"#6a5acd\">$2<\/font>$4/){}

という処理で1時しのぎしています。
正しい方法を教えてください。

tre [E-Mail] 1999/06/14(月) 05:22:54
正規表現は苦手なので間違ってるかもしれないですけど、、
このように、<br>で分けて処理すれば簡単なのでは?

foreach $pair ( split(/<br>|<BR>/, $f_msg) ) {
$pair =~ s/^([>|&gt;].*)/<Font>$1<\/Font>/;
push(@tmp, $pair);
}
$f_msg = join('<br>', @tmp);
print $f_msg;

的外れだったらごめんなさい・・

じぇい 1999/06/14(月) 13:21:25
treさん、どうもありがとうございます。
う〜む、、そういう方法もありますね、、。
しかし、、もうちっと簡単にはできないんでしょうかね、、。。
引用文の数が少ない分には、

while($f_msg =~ s/(^|<BR>)((&gt;|>).+?)(<BR>|$)/$1<font color=\"#6a5acd\">$2<\/font>$4/){}

これでも問題無いんですけどね、、。
関数一つ一つの速さがわからないんで、treさんの方法がどの程度の早さなのかはわからないのですが、、一つの式だけでもっと簡単に何とかならないんでしょうかね?

B-Cus 1999/06/14(月) 16:17:12
どうも毎回小さなことにこだわっていらっしゃいますねぇ。
根本的なアルゴリズムならともかく、数行の書換え次第で変わるような
速度だとか効率なんてのは、最後の最後に考えればいいのでは?

それに速度にこだわっておられる割には、自分で実行速度を
計測してみるつもりはないようですし。

> はじめの>テストの色だけが変わり、2行目の>テストの色が変わりません。
という状況が再現できなかったのでよくわかりませんが
($f_msgの初期値がわからんので)、
 s///gm
とかじゃなくて?

じぇい 1999/06/14(月) 16:36:05
>それに速度にこだわっておられる割には、自分で実行速度を
>計測してみるつもりはないようですし。
引用文というのは毎回決まった回数使うわけではないので、速度計算をどのように行うかが難しいです。引用文を何回使ってメッセージはどれくらいの長さで、、というのがはっきりしてないので、、。
まあ、だから小さいことにこだわるな、、と言われればそれまでですが、、。

>$f_msgの初期値
改行はすべて削除、もしくは<BR>に置き換えています。
ひとつのメッセージを1行ずつファイルに保存する処理を行っているので。
はじめは、
要するに、文字列の最初、もしくは<BR>のすぐ後ろに&gt;もしくは>が来ていたら、次の<BR>まで色を変える処理を行おうと思っています。

それではじめに記述した通りにすると、/g の特質のせいか、
>テスト<BR>
>テスト<BR>

という文字列の場合にうまくいきません。
例えば、
>テスト<BR>
>テスト<BR>
>テスト<BR>
>テスト<BR>
とすると、一行おきに色が変わります。

B-Cus 1999/06/14(月) 16:42:29
ああ、なるほど。
 $f_msg=">テスト<BR>>テスト<BR>"
ってことね。

> 改行はすべて削除、もしくは<BR>に置き換えています。
をする前なら
 $f_msg=">テスト\n>テスト\n"
となっているでしょうから、そこでs///g か s///gm すればいいのでは。

> 速度計算をどのように行うかが難しいです。
でもさ、速度にこだわるなら、ある文章を変換するのにどれくらい時間が
かかるかを試すのは当然だと思いますよ。

じぇい 1999/06/14(月) 16:44:18
>はじめは、
>要するに、文字列の…
”はじめは、”は記述ミスです。無視してください。

ちなみに、スクリプト自体は完成しています。それでずっと使っていたのですが、この前引用文の色が正しく変わらないことを発見しました。
どうしても、/gを使ってうまくやることができなかったので、ずっと悩んでいました。別に今行っている1時しのぎの方法でもぜんぜん問題ないんですが、、、処理速度を少しでも速めたい、、、というか、単にもっと簡単に記述する方法が知りたかったので、、。

じぇい 1999/06/14(月) 17:02:06
[[解決]]
できました。
どうも、考えすぎてたみたいでした、、。
<BR>を区切りに、、というなんか変ないじみたいなのがあって改行を<BR>に変更する前に引用文の色を変えるということが頭の中にありませんでした。^^;

どうもありがとうございました。m(_ _)m

[上に] [前に] [次に]