人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Perlにて、以下のようなソースがあります。

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>となってほしいのですが、置き換え部分を弄ってそのように出来るのであれば知りたいです。(正規表現はさっぱり駄目なので解説はしていただいても理解できません)
よろしくお願いします。

●質問者: metatron3rd
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:ABC HTML Perl STR キーワード
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● irukajp
●20ポイント

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

◎質問者からの返答

書いてなかったのですが、HTML文中にはキーワードが複数回登場します。

また、お教えいただいた方法ではリンクされたりされなかったりします。あるキーワードは複数回リンクされるけどあるキーワードは1回だけリンクされるというような動作をします。また、ABCはリンクされましたがABは無視されてしまいました(1回もリンクされません)判りにくくてすいません・・・


2 ● GEN111
●20ポイント
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へリンクされない場合もあります。

・リンクされないものがほとんどとなりました。


3 ● b-wind
●20ポイント

正規表現ダメと言いつつ、変わったコード書いてますねえ。

my $regex = '(' . join ( '|', sort { $b cmp $a } keys %RLIST ) . ')';
s!$regex!<a href="$RLIST{$i}" $style>$i</a>!g;

こういうことではないの?

◎質問者からの返答

私が書いたわけではなく、公開されているスクリプトを見て、置き換え処理部分はここだろうなと思って質問したのです。

なお、うまくいきませんでした。

一つ上と同じ症状なので、私がうまくソースを置き換えで来ていないのかも知れませんが・・・


4 ● GEN111
●20ポイント

すいません。

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 ;
 }
}

これではどうでしょうか。

◎質問者からの返答

>すいません。

いえいえ、とんでもないです。

試してみましたが症状は同じでした。一つ上でもコメントしたのですが、私がソース修正をミスしているのかもしれませんのでもう少し確認してみます。


5 ● b-wind
●20ポイント
my $regex = '(' . join ( '|', sort { $b cmp $a } keys %RLIST ) . ')';
$str =~ s!$regex!<a href="$RLIST{\1}" $style>\1</a>!g;

ちょっとミスがあったので。たぶん結果は同じだろうけど。


なお、うまくいきませんでした。

何がどううまくいかないのかこっちではさっぱり分からないので、もうちょっと実例を出して説明してくれると進むんじゃないかな。

◎質問者からの返答

確かに。

当初考えていたのは「そのものずばりの答え」か「そんなことは不可能です」のどちらかかなぁと思ってたので、該当部分だけ抜き出して質問すればいいかと思ってました。

質問の仕方が悪いのでせっかく教えてもらっても実行結果の症状もうまく伝えられなくなってます。

一旦閉じて、具体例とどこのソースかを提示させていただいて、もう一度質問させていただきます。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ