Expresión regular para buscar a Gadaffi [cerrado]

Resuelto SiggyF asked hace 13 años • 15 respuestas

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?

SiggyF avatar Mar 20 '11 05:03 SiggyF
Aceptado

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.

Chris Pacejo avatar Mar 21 '2011 18:03 Chris Pacejo

\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
Czechnology avatar Mar 19 '2011 22:03 Czechnology

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.

tomwalsham avatar Mar 21 '2011 16:03 tomwalsham