我正在搜索“卡扎菲”这个词,这个词有很多种拼写方式。搜索这个最好的正则表达式是什么?
以下是30个变体的列表:
Gadaffi
Gadafi
Gadafy
Gaddafi
Gaddafy
Gaddhafi
Gadhafi
Gathafi
Ghadaffi
Ghadafi
Ghaddafi
Ghaddafy
Gheddafi
Kadaffi
Kadafi
Kaddafi
Kadhafi
Kazzafi
Khadaffy
Khadafy
Khaddafi
Qadafi
Qaddafi
Qadhafi
Qadhdhafi
Qadthafi
Qathafi
Quathafi
Qudhafi
Kad'afi
目前为止我最好的尝试是:
\b[KG]h?add?af?fi$\b
但我似乎还是遗漏了一些变体。有什么建议吗?
\ [KGQ] b h添加? h ?房颤?fi \ b
阿拉伯语的翻译是(维基说)“Qaḏḏāfī”,所以可能会加上一个q和一个H(“卡扎菲”,如文章(见下文)所述)。
顺便说一下,为什么在正则表达式的末尾有一个$ ?
顺便说一句,关于这个话题的文章不错:
卡扎菲,卡扎菲,还是卡扎菲?为什么这位利比亚领导人的名字有这么多种拼写方式?
EDIT
为了匹配后面提到的文章中的所有名称,这应该匹配所有名称。我们只希望它不会和其他很多东西匹配:D
\b(Kh?|Gh?|Qu?)[aeu](d['dt]?|t|zz|dhd)h?aff?[iy]\b
从潜在拼写列表中需要注意的一件有趣的事情是,包含的列表中只有3个Soundex值(如果忽略离群值'Kazzafi')
G310, k310, q310
现在,这里存在误报(“Godby”也是G310),但是通过结合有限的变音位命中,可以消除它们。
<?
$soundexMatch = array('G310','K310','Q310');
$metaphoneMatch = array('KTF','KTHF','FTF','KHTF','K0F');
$text = "This is a big glob of text about Mr. Gaddafi. Even using compound-Khadafy terms in here, then we might find Mr Qudhafi to be matched fairly well. For example even with apostrophes sprinkled randomly like in Kad'afi, you won't find false positives matched like godfrey, or godby, or even kabbadi";
$wordArray = preg_split('/[\s,.;-]+/',$text);
foreach ($wordArray as $item){
$rate = in_array(soundex($item),$soundexMatch) + in_array(metaphone($item),$metaphoneMatch);
if ($rate > 1){
$matches[] = $item;
}
}
$pattern = implode("|",$matches);
$text = preg_replace("/($pattern)/","<b>$1</b>",$text);
echo $text;
?>
稍作调整,再加上一些西里尔字母的音译,您将得到一个相当健壮的解决方案。