Expresión regular para buscar a Gadaffi [cerrado]
Estoy intentando buscar la palabra Gadaffi, que se puede escribir de muchas formas diferentes . ¿Cuál es la mejor expresión regular para buscar esto?
Esta es una lista de 30 variantes:
Gadafi Gadafi Gadafi Gadafi Gadafi Gadafi Gadafi Gathafi Gadafi Gadafi Gadafi Gadafi Gadafi Kadaffi Kadafi Gadafi Gadafi kazafi Khadaffy Gadafi Gadafi Gadafi Gadafi Gadafi Gadafi Gadafi Qatafi Quathafi Qudafi Gadafi
Mi mejor intento hasta ahora es:
\b[KG]h?add?af?fi$\b
Pero todavía parece que me faltan algunas variantes. ¿Alguna sugerencia?
Fácil... (Qadaffi|Khadafy|Qadafi|
... )
... está autodocumentado, se puede mantener y, asumiendo que su motor de expresiones regulares realmente compila expresiones regulares (en lugar de interpretarlas), se compilará en el mismo DFA que lo haría una solución más ofuscada.
Escribir expresiones regulares compactas es como usar nombres de variables cortos para acelerar un programa. Sólo ayuda si su compilador tiene muerte cerebral.
\b[KGQ]h?add?h?af?fi\b
La transcripción árabe es (Wiki dice) "Qaḏḏāfī", por lo que tal vez agregue una Q. Y una H ("Gadhafi", como menciona el artículo (ver más abajo).
Por cierto, ¿por qué hay $
al final de la expresión regular?
Por cierto, buen artículo sobre el tema:
¿Gadafi, Kadafi o Gadafi? ¿Por qué el nombre del líder libio se escribe de tantas maneras diferentes? .
EDITAR
Para que coincida con todos los nombres del artículo que mencionaste más adelante , esto debería coincidir con todos. Esperemos que no coincida con muchas otras cosas :D
\b(Kh?|Gh?|Qu?)[aeu](d['dt]?|t|zz|dhd)h?aff?[iy]\b
Una cosa interesante a tener en cuenta en su lista de posibles ortografías es que solo hay 3 valores Soundex para la lista contenida (si ignora el valor atípico 'Kazzafi')
G310, K310, Q310
Ahora, hay falsos positivos allí ('Godby' también es G310), pero al combinar también los accesos limitados del metafono, puedes eliminarlos.
<?
$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;
?>
Unos cuantos ajustes, y digamos algo de transliteración cirílica, y tendrás una solución bastante sólida.