2010-10-29 15 views
10

Script di espressioni regolari PHP per rimuovere tutto ciò che non è una lettera alfabetica o il numero da 0 a 9 e sostituire lo spazio in un trattino - cambia in minuscolo assicurarsi che ci sia solo un trattino - tra le parole no - o --- eccEspressione regolare - qualsiasi testo in URL friendly

Ad esempio:

esempio: il quick brown fox saltato Risultato: la-quick-marrone-fox-saltato

esempio: il quick brown fox saltato ! Risultato: il-quick-brown-fox-jumped

Esempio: la volpe marrone veloce - saltato! Risultato: la-quick-marrone-fox-saltato

Esempio: La rapida ~ `@ # $%^& *() _ + = ------- marrone {} |] [:!" ?.!! '; <>,/fox - saltato Risultato: la-quick-marrone-fox-saltato

Esempio: la rapida 1234567890 ~ ​​`@ # $%^& *() _ + = - ----- brown {} |] [: "'; <>?.,/Fox - saltato! Risultato: la-quick-1234567890-marrone-fox-saltato


Qualcuno ha un'idea per l'espressione regolare?

Grazie!

+0

Potresti voler lasciare dei trattini quando sono direttamente tra le parole (ad esempio "qualcosa" non dovrebbe tradurre in "qualcosa") e altri casi speciali. –

risposta

27

Dal momento che sembra voler tutte le sequenze di caratteri non alfanumerici viene sostituita da un singolo trattino, è possibile utilizzare questo:

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

ma questo può causare iniziali o finali trattini che possono essere rimosso con trim:

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

E per convertire il risultato in lettere minuscole, utilizzare strtolower:

$str = strtolower($str); 

Quindi, tutti insieme:

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

O in un compatto one-liner:

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

Grazie! Funziona alla grande! – Paul

+2

Penso che un'alternativa migliore sia la prima sostituzione di spazi bianchi, quindi non spazi bianchi/non alfanumerici. In molti casi i caratteri non spaziati e non alfanumerici non dovrebbero essere tratteggiati. Vale a dire: "Women's Night" sarebbe "women-s-night". Vorrei prima sostituire lo spazio bianco ('/ \ s + /') con trattini, quindi sostituire tutto il resto ('/ [^ a-zA-Z0-9] + /') con una stringa vuota. Puoi anche omettere il ritaglio. –

+0

Modifica in alto: dovrai aggiungere un trattino alla seconda sostituzione: '/ [^ a-zA-Z0-9 \ -] + /' –

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

Stavo lavorando con qualcosa di simile, e sono arrivato fino a questo piccolo pezzo di codice , contempla anche l'uso di caratteri latini.

Questa è la stringa di esempio:

$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';

Per prima cosa ho convertire la stringa htmlentities solo per rendere più facile da utilizzare in seguito.

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

Poi ho sostituire i caratteri latini con i loro caratteri ASCII corrispondenti (á diventa a, Ü diventa U, e così via):

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

Poi ho convertire la stringa di ritorno da html entità ai simboli, ancora per un uso più semplice in seguito.

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

Poi ho sostituire tutti i caratteri non alfanumerici in trattini.

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

rimuovo trattini in più all'interno della stringa:

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

rimuovo iniziali e finali trattini:

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

E infine convertire tutto in minuscolo:

$friendlyURL = strtolower($friendlyURL);

Tutti insieme:

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; 

} 

prova:

$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); 

Risultato:

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

Credo che la risposta di Gumbo si adatta al vostro problema in maniera migliore, ed è un codice più corto, ma ho pensato che sarebbe stato utile per gli altri.

Cheers, Adriana

+0

Perfetto !!!!!!!! – Leonardo

+0

Funziona perfettamente! Salvami la vita! Grazie! – vinigarcia87

+0

5 anni dopo funziona ancora come un fascino. Facile, semplice, lo adoro. Grazie Signore! – LuBre

1

Se stai usando questo per i nomi dei file in PHP, la risposta Gumbo sarebbero

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

Aggiunto un periodo per i nomi di file ed è strtolower(), non strtolowercase().

6

In una funzione:

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))), '-'); 
} 

Cosa fa:

// 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:
È possibile combinare più preg_replace passando un array. Vedi la funzione in alto.

Ad esempio:

// É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: aggiunto "/ u" alla fine della regex di utilizzare UTF8
EDIT: rappresentavano il duplicato e leader/trattini finali, grazie alla @LuBre

+0

Penso che sia la soluzione migliore finora. – barell

+0

Bello, vorrei semplicemente aggiungere '$ str = preg_replace ('/ - + /', '-', $ str)' per rimuovere eventuali spazi consecutivi. Esempio: ciao-come --- sei-tu? Sarà convertito in "ciao-come-sei-tu". – LuBre

+0

Grazie a @LuBre, ho incorporato il tuo feedback – gabssnake