2010-08-29 17 views
5

Sto cercando di sostituire in una stringa tutti i caratteri non word con stringa vuota si aspettano spazi e riuniscono tutti gli spazi multipli come un unico spazio.PHP mb_ereg_replace non sostituisce mentre preg_replace funziona come previsto

Il seguente codice esegue questa operazione.

$cleanedString = preg_replace('/[^\w]/', ' ', $name); 
$cleanedString = preg_replace('/\s+/', ' ', $cleanedString); 

Ma quando sto cercando di utilizzare mb_ereg_replace non accade nulla.

$cleanedString = mb_ereg_replace('/[^\w]/', ' ', $name); 
$cleanedString = mb_ereg_replace('/\s+/', ' ', $cleanedString); 

$ cleanString è uguale a quello se $ nome nel caso precedente. Che cosa sto facendo di sbagliato?

risposta

10

mb_ereg_replace non utilizza separatori. È possibile o meno dover specificare la codifica in precedenza.

mb_regex_encoding("UTF-8"); 
//regex could also be \W 
$cleanedString = mb_ereg_replace('[^\w]', ' ', $name); 
$cleanedString = mb_ereg_replace('\s+', ' ', $cleanedString); 
+0

Grazie è stato l'errore che ho fatto. Se il mio input è UTF-8 ci sono raccomandazioni riguardo quale metodo usare? – Jithin

+0

@Jithin Se è UTF-8, si potrebbe anche usare 'preg_replace' con il flag' u': 'preg_replace ('/ \ s +/u', '', $ cleanedString);' – Artefacto

+0

@Artefacto Grazie. Puoi dirmi se è sicuro che fino a quando l'input è nella codifica UTF-8, preg_replace funzionerà per la maggior parte delle lingue? – Jithin

-3

L'input non è Multi-Byte quindi la funzione mb ha esito negativo.

+0

ok. Ma puoi spiegare quando dovremmo usare mb_ereg_replace anziché preg_replace se il mio input è in UTF-8. Attualmente ho passato il testo inglese come $ name. Ma se domani usassi un altro linguaggio, direi che il mio codice verrà interrotto in hindi? – Jithin

+0

Sbagliato. L'estensione multibyte può gestire codifiche a singolo byte. – Artefacto

+0

@Artefacto: OK, il mio male. – shamittomar

-1
function create_slug_html($string, $ext='.html'){  
    $replace = '-';   
    $string=strtolower($string);  
    $string=trim($string); 

    mb_regex_encoding("UTF-8"); 
    //regex could also be \W 
    $string= mb_ereg_replace('[^\w]', ' ', $string); 
    $string= mb_ereg_replace('\s+', ' ', $string); 

    //remove query string  
    if(preg_match("#^http(s)?://[a-z0-9-_.]+\.[a-z]{2,4}#i",$string)){   
     $parsed_url = parse_url($string);   
     $string = $parsed_url['host'].' '.$parsed_url['path'];   
     //if want to add scheme eg. http, https than uncomment next line   
     //$string = $parsed_url['scheme'].' '.$string;  
    }  
    //replace/and . with white space  
    $string = preg_replace("/[\/\.]/", " ", $string); 

    // $string = preg_replace("/[^a-z0-9_\s-]/", "", $string); 

    //remove multiple dashes or whitespaces  
    $string = preg_replace("/[\s-]+/", " ", $string); 

    //convert whitespaces and underscore to $replace  
    $string = preg_replace("/[\s_]/", $replace, $string);  
    //limit the slug size  
    $string = substr($string, 0, 200);  
    //slug is generated  
    return ($ext) ? $string.$ext : $string; 

}

prega è ok e sostenere inglese e unicode

+0

Mentre le risposte al solo codice non sono vietate, per favore comprendi che questa è una community di domande e risposte, piuttosto che una fonte di crowdsourcing, e che, di solito, se l'OP ha capito che il codice è stato postato come risposta, lui/lei avrebbe escogitato una soluzione simile al suo stesso e non avrebbe pubblicato una domanda in primo luogo. Pertanto, fornisci il contesto alla tua risposta e/o al codice spiegando * come * e/o * perché * funziona. – XenoRo