2010-10-29 18 views
10

Script de expresión regular PHP para eliminar cualquier cosa que no sea una letra alfabética o números del 0 al 9 y reemplazar el espacio por un guión - cambiar a minúscula; asegurarse de que haya un solo guión - entre palabras no - o --- etc.Expresión regular: cualquier texto para ser amigable con la URL

Por ejemplo:

ejemplo: el rápido zorro marrón saltó Resultado: el-rápido-marrón-fox-saltó

ejemplo: el rápido zorro marrón saltó ! Resultado: the-quick-brown-fox-jump

Ejemplo: El zorro marrón rápido: ¡saltó! Resultado: el rápido zorro marrón-saltó

Ejemplo: La rápida ~ `@ # $%^& *() _ + = ------- marrón {} |] [:!" ?.! '; <>,/Fox - saltado Resultado: el rápido zorro marrón-saltó

Ejemplo: la rápida 1234567890 ~ ​​`@ # $%^& *() _ + = - ----- marrón {} |] [: "'; <>?.,/Fox - ¡saltó! Resultado: el-rápida-1234567890-marrón-fox-saltado


Alguien tiene idea de la expresión regular?

Gracias!

+0

Es posible que desee dejar guiones cuando están directamente entre las palabras (por ejemplo, "algo" no se debe traducir a "algo") y otros casos especiales. –

Respuesta

27

Ya que parece querer todas las secuencias de caracteres no alfanuméricos se sustituyen por un guión, puede utilizar esto:

$str = preg_replace('/[^a-zA-Z0-9]+/', '-', $str); 

Pero esto puede resultar en principio o al final guiones que pueden ser eliminarse con trim:

$str = trim($str, '-'); 

Y para convertir el resultado en minúsculas, utilice strtolower:

$str = strtolower($str); 

Así que todos juntos:

$str = strtolower($str); 
$str = trim($str, '-'); 
$str = preg_replace('/[^a-z0-9]+/', '-', $str); 

O en un compacto de una sola línea:

$str = strtolower(trim(preg_replace('/[^a-zA-Z0-9]+/', '-', $str), '-')); 
+0

¡Gracias! ¡Funciona genial! – Paul

+2

Creo que una mejor alternativa es reemplazar primero el espacio en blanco, luego no el espacio en blanco/no alfanumérico. En muchos casos, los caracteres no alfanuméricos y no alfanuméricos no deben ser guiones. Es decir: "Women's Night" sería "women-s-night". Primero reemplazaría el espacio en blanco ('/ \ s + /') con guiones, luego reemplazaré todo lo demás ('/ [^ a-zA-Z0-9] + /') con una cadena vacía. También puedes omitir el recorte. –

+0

Editar a arriba: deberá agregar un guion al segundo reemplazo: '/ [^ a-zA-Z0-9 \ -] + /' –

17

Estaba trabajando con algo similar, y se me ocurrió con esta pequeña pieza de código , también contempla el uso de caracteres latinos.

Esta es la cadena de ejemplo:

$str = 'El veloz murciélago hindú comía fe<!>&@#$%&!"#%&?¡?*liz cardillo y kiwi. La cigüeña ¨^;.-|°¬tocaba el saxofón detrás del palenque de paja';

Primero convertir la cadena en htmlentities sólo para que sea más fácil de usar más tarde.

$friendlyURL = htmlentities($str, ENT_COMPAT, "UTF-8", false);

Entonces reemplazar caracteres latinos con sus correspondientes caracteres ASCII (á se convierte en a, Ü convierte U, y así sucesivamente):

$friendlyURL = preg_replace('/&([a-z]{1,2})(?:acute|circ|lig|grave|ring|tilde|uml|cedil|caron);/i','\1',$friendlyURL);

Entonces convertir la cadena de vuelta de html entidades a símbolos, de nuevo para un uso más fácil más adelante.

$friendlyURL = html_entity_decode($friendlyURL,ENT_COMPAT, "UTF-8");

siguiente que reemplazar todos los caracteres no alfanuméricos en guiones.

$friendlyURL = preg_replace('/[^a-z0-9-]+/i', '-', $friendlyURL);

elimino guiones adicionales dentro de la cadena:

$friendlyURL = preg_replace('/-+/', '-', $friendlyURL);

me retire anterior y posterior guiones:

$friendlyURL = trim($friendlyURL, '-');

Y finalmente convertir todo en minúsculas:

$friendlyURL = strtolower($friendlyURL);

Todos juntos:

function friendlyUrl ($str = '') { 

    $friendlyURL = htmlentities($str, ENT_COMPAT, "UTF-8", false); 
    $friendlyURL = preg_replace('/&([a-z]{1,2})(?:acute|circ|lig|grave|ring|tilde|uml|cedil|caron);/i','\1',$friendlyURL); 
    $friendlyURL = html_entity_decode($friendlyURL,ENT_COMPAT, "UTF-8"); 
    $friendlyURL = preg_replace('/[^a-z0-9-]+/i', '-', $friendlyURL); 
    $friendlyURL = preg_replace('/-+/', '-', $friendlyURL); 
    $friendlyURL = trim($friendlyURL, '-'); 
    $friendlyURL = strtolower($friendlyURL); 
    return $friendlyURL; 

} 

prueba:

$str = 'El veloz murciélago hindú comía fe<!>&@#$%&!"#%&-?¡?*-liz cardillo y kiwi. La cigüeña ¨^`;.-|°¬tocaba el saxofón detrás del palenque de paja'; 

echo friendlyUrl($str); 

Resultado:

el-veloz-murcielago-hindu-comia-fe-liz-cardillo-y-kiwi-la-ciguena-tocaba-el-saxofon-detras-del-palenque-de-paja 

supongo que la respuesta de Gumbo se adapte a su problema mejor, y es un código más corto, pero pensé que sería útil para otros.

Saludos, Adriana

+0

Perfecto !!!!!!!! – Leonardo

+0

¡Funciona perfecto! ¡Salva mi vida! ¡Gracias! – vinigarcia87

+0

5 años después todavía funciona como un encanto. Fácil, simple, me encanta. ¡Gracias Señor! – LuBre

1

Si está usando esto para nombres de archivo en PHP, la respuesta por Gumbo serían

$str = preg_replace('/[^a-zA-Z0-9.]+/', '-', $str); 
$str = trim($str, '-'); 
$str = strtolower($str); 

añadido un periodo de nombres de archivo y es strtolower(), no strtolowercase().

6

En función:

function sanitize_text_for_urls ($str) 
{ 
    return trim(strtolower(preg_replace(
     array('/[^a-z0-9-\s]/ui', '/\s/', '/-+/'), 
     array('', '-', '-'), 
     iconv('UTF-8', 'ASCII//TRANSLIT', $str))), '-'); 
} 

Lo que hace:

// Solve accents and diacritics 
$str = iconv('UTF-8', 'ASCII//TRANSLIT', $str); 

// Leave only alphanumeric (respect existing hyphens) 
$str = preg_replace('/[^a-z0-9-\s]/ui', '', $str); 

// Turn spaces to hyphens 
$str = preg_replace('/\s+/', '-', $str); 

// Remove duplicate hyphens 
$str = preg_replace('/-+/', '-', $str); 

// Remove trailing hyphens 
$str = trim($str, '-'); 

// Turn to lowercase 
$str = strtolower($str); 

Nota:
Se pueden combinar múltiples preg_replace pasando un array. Ver la función en la parte superior.

Por ejemplo:

// Électricité, plâtrerie --> electricite-platrerie 
// St. Lücie-Pétêrès   --> st-lucie-peteres 
// -Façade- & gros œuvre  --> facade-gros-oeuvre 

// _-Thè quîck ~`[email protected]#&$%^ &*()_+= ---{}|][ :"; <>?.,/ fóx - jümpëd_- 
// the-quick-fox-jumped 

EDIT: añadido "/ u" al final de la expresión regular para usar UTF8
EDIT: representaron el duplicada y líder/guiones finales, gracias a @LuBre

+0

Creo que es la mejor solución hasta ahora. – barell

+0

Bueno, solo agregaría '$ str = preg_replace ('/ - + /', '-', $ str)' para eliminar cualquier posible espacio consecutivo. Ejemplo: 'hello-how --- are-you' se convertirá en' hello-how-are-you'. – LuBre

+0

Gracias @LuBre, he incorporado tus comentarios – gabssnake

Cuestiones relacionadas