テキストファイルを1行ずつ処理し、それらの行内のフレーズをリンクに変換するperlスクリプトがあります(特にmediawikiマークアップでは、どのマークアップでも同じ問題が発生する可能性があります)。私が行き詰まるのは、あるフレーズが別のフレーズのサブセットである場合です。このような場合、作成されるリンクが多すぎます。
たとえば、「一般委員会」と「年次一般委員会会議」が2つのフレーズである場合:
総会は月1回開催します。
正しく変換されます:
[[#GC|一般委員会]]会議は月に1回開催されます。
でも、
年次総会は5月に開催されます。
誤って次のように変換されます:
[[#AGCM|年次[[#GC|一般委員会]]会議]]は5月に開催されます。
つまり、私のスクリプトは、「年次一般委員会会議」内で「一般委員会」というフレーズを見つけて、不要な場所にリンクを挿入しています。この例では、AGCMへのリンクのみが存在する必要があります。
関連するperlコードは次のとおりです。
my($line) = $_;
foreach $phrase (keys(%phrases)) # the phrases to replace mapped to their links
{
my($link) = $phrases{$phrase};
if ($line =~ m/$phrase/)
{
$line =~ s/$phrase/[[#$link|$phrase]]/g;
}
}
あるフレーズが別のフレーズで見つかった場合に一致/置換を回避する方法についての提案はありますか?
更新:いくつかの質問に基づく明確化:各フレーズは独立しています。お互いに優先順位はありません。私が必要なものを手に入れるには、最短のものよりも最長のものをとるだけで十分です。