foreach $i (keys %RLIST){
if($i ne ''){
$str =~ s/\G((?:[\x00-\x7F]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE]{2})*?)\Q$i\E/$1<a href="$RLIST{$i}" $style>$i<\/a>/g;
}
}
これは、ハッシュのキーワードをHTML文中に見つけたらハッシュに定義されているリンクを設定するものです。
例としてハッシュに(AB,XXX),(ABC,YYY)があるものとします。
このままだと、本文中にABCがあるとき、ABがひっとしてしまいます。そこでハッシュを逆順にして(reverse)みたのですが、今度は<a href="YYY"><a href="XXX">AB</a>C</a>という間抜けなものになってしまいました。
この場合は<a href="YYY">ABC</a>となってほしいのですが、置き換え部分を弄ってそのように出来るのであれば知りたいです。(正規表現はさっぱり駄目なので解説はしていただいても理解できません)
よろしくお願いします。
http://www.kent-web.com/perl/chap7.html
上記はダミー
$str =~ s/\b((?:[\x00-\x7F]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1 -\xFE]{2})*?)$i\b/$1
foreach $i (sort {$b cmp $a} (keys %RLIST)) { if($i ne ''){ $str =~ s/\G((?:[\x00-\x7F]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE]{2})*?)\Q$i\E/$1<a href="$RLIST{$i}" $style>$i<\/a>/g ; $str =~ m!<a.+?>.*?</a>!g ; } }
これではどうでしょう。
ただし、ここに来る前に $str にリンクがあるとダメですが。
回答ありがとうございます。
試してみたのですが、以下のような状態となりました。
・ABはリンクされず、ABCはリンクされる。
・他にもDEFやGHIなどのキーワードがありますが、((DEF,XYZ)、(GHI,ZZZ)として)GHIへのリンクのされ方がGHIのようになってしまいました。GHIへリンクされない場合もあります。
・リンクされないものがほとんどとなりました。
正規表現ダメと言いつつ、変わったコード書いてますねえ。
my $regex = '(' . join ( '|', sort { $b cmp $a } keys %RLIST ) . ')'; s!$regex!<a href="$RLIST{$i}" $style>$i</a>!g;
こういうことではないの?
私が書いたわけではなく、公開されているスクリプトを見て、置き換え処理部分はここだろうなと思って質問したのです。
なお、うまくいきませんでした。
一つ上と同じ症状なので、私がうまくソースを置き換えで来ていないのかも知れませんが・・・
すいません。
foreach $i (sort {$b cmp $a} (keys %RLIST)) { if($i ne ''){ $str =~ s!(<a.+?>.*?</a>)|(\Q$i\E)!$1?$1:qq{<a href="$RLIST{$i}" $style>$i</a>}!e ; } }
これではどうでしょうか。
>すいません。
いえいえ、とんでもないです。
試してみましたが症状は同じでした。一つ上でもコメントしたのですが、私がソース修正をミスしているのかもしれませんのでもう少し確認してみます。
my $regex = '(' . join ( '|', sort { $b cmp $a } keys %RLIST ) . ')'; $str =~ s!$regex!<a href="$RLIST{\1}" $style>\1</a>!g;
ちょっとミスがあったので。たぶん結果は同じだろうけど。
なお、うまくいきませんでした。
何がどううまくいかないのかこっちではさっぱり分からないので、もうちょっと実例を出して説明してくれると進むんじゃないかな。
確かに。
当初考えていたのは「そのものずばりの答え」か「そんなことは不可能です」のどちらかかなぁと思ってたので、該当部分だけ抜き出して質問すればいいかと思ってました。
質問の仕方が悪いのでせっかく教えてもらっても実行結果の症状もうまく伝えられなくなってます。
一旦閉じて、具体例とどこのソースかを提示させていただいて、もう一度質問させていただきます。
書いてなかったのですが、HTML文中にはキーワードが複数回登場します。
また、お教えいただいた方法ではリンクされたりされなかったりします。あるキーワードは複数回リンクされるけどあるキーワードは1回だけリンクされるというような動作をします。また、ABCはリンクされましたがABは無視されてしまいました(1回もリンクされません)判りにくくてすいません・・・