PHP mb_ereg_replace nu înlocuiește în timp ce preg_replace funcționează așa cum este prevăzut (Programare, Php, Regex, Pcre, Multibyte)

Jithin a intrebat.
a intrebat.

Încerc să înlocuiesc într-un șir de caractere toate caracterele care nu sunt cuvinte cu un șir gol, cu excepția spațiilor și să pun împreună toate spațiile multiple ca un singur spațiu.

Următorul cod face acest lucru.

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

Dar când încerc să folosesc mb_ereg_replace nu se întâmplă nimic.

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

$cleanedString este același cu cel din $name în cazul de mai sus. Ce fac greșit?

3 răspunsuri
Artefacto

mb_ereg_replace nu folosește separatori. Este posibil să trebuiască sau nu să specificați și codificarea înainte.

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

Comentarii

  • Mulțumesc, asta a fost greșeala pe care am făcut-o. Dacă intrarea mea este UTF-8, există vreo recomandare cu privire la ce metodă să folosesc? –  > Por Jithin.
  • @Jithin Dacă este UTF-8, puteți la fel de bine să folosiți preg_replace cu u flag: preg_replace('/s+/u', ' ', $cleanedString); –  > Por Artefacto.
  • @Artefacto Mulțumesc. Puteți să-mi spuneți, vă rog, dacă este sigur să presupunem că, atâta timp cât intrarea este în codificare UTF-8, preg_replace va funcționa pentru majoritatea limbilor? –  > Por Jithin.
  • @Jithin Depinde de ceea ce vrei să spui cu „funcționează”. Va funcționa în sens strict – nu va genera date corupte, dar probabil că nu face ceea ce vă doriți. Luați în considerare primul regex. În PCRE (motorul preg_replace folosește), w va însemna doar [a-zA-Z0-9_]. Dacă doriți să eliminați toate caracterele care nu sunt cuvinte, o opțiune mai bună este să utilizați [^p{L}p{Nd}p{Mn}_]. Astfel, se vor potrivi toate caracterele care nu sunt (conform Unicode) litere, semne de spațiere (pentru accente etc.), cifre zecimale și underscore. –  > Por Artefacto.
  • @Jithin Nu. oniguruma. În mod implicit, w înseamnă (Literă|Marcă|Număr|Conectare_Punctuație). –  > Por Artefacto.
Pramod Verma
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; 

}

vă rugăm să verificați dacă este în regulă și dacă acceptă limba engleză și Unicode

Comentarii

  • În timp ce răspunsurile bazate doar pe cod nu sunt interzise, vă rugăm să înțelegeți că aceasta este o comunitate de întrebări și răspunsuri, mai degrabă decât una de crowd-sourcing, și că, de obicei, dacă OP ar fi înțeles codul postat ca răspuns, ar fi găsit o soluție similară pe cont propriu și nu ar fi postat o întrebare în primul rând. Ca atare, vă rugăm să oferiți un context pentru răspunsul și/sau codul dvs. explicând cum și/sau de ce funcționează. –  > Por XenoRo.
shamittomar

Intrarea nu este Multi-Byte de unde rezultă că mb eșuează.

Comentarii

  • ok. Dar puteți să explicați când ar trebui să folosim mb_ereg_replace în loc de preg_replace dacă datele de intrare sunt în UTF-8. În prezent, am trecut textul în engleză ca $name. Dar dacă mâine voi folosi o altă limbă, de exemplu hindi, codul meu se va strica? –  > Por Jithin.
  • Greșit. Extensia multibyte poate gestiona codificări cu un singur octet. –  > Por Artefacto.