2016-04-15 27 views
1

我試圖從字符串中刪除重音並在php中寫入以下函數,但它不會將其刪除。字符串帶有重音符號,並以重音符號返回。嘗試從字符串中刪除重音在php

function stripaccents($string) 
{ 
    $replace = array('é','í','ó','á','ñ', 'ú', 'ü'); 
    $with = array('e','i','o','a', 'n', 'u', 'u'); 

    foreach ($replace as &$char) 
    { 
     $char = utf8_decode($char); 
    } 
    unset($char); 

    $newstring = str_replace($replace, $with, $string); 

    return $newstring; 
} 
+0

我認爲它應該可以正常工作,如果你刪除foreach/unset。 utf8_decode調用可能會弄亂你的替換字符。 – JimL

+0

關鍵問題是爲什麼你覺得你需要刪除口音一致使用UTF-8,你不應該有任何問題 –

+0

萬達,顯示輸入字符串 – RomanPerekhrest

回答

1

如果你使用PHP 5.3或更高版本(你應該是),使用內置的功能:

$newstring = normalizer_normalize($oldstring); 
+0

我不知道這個功能。與[Patchwork UTF-8](https://github.com/tchwork/utf8)相比,它的性能如何? –

+0

@GrasDouble它是intl包的一部分。它工作正常 - 特別是僅僅將短字符串轉換爲ASCII。 – kainaw

1

您還可以使用iconv

$newstring = iconv('UTF-8', 'ASCII//TRANSLIT', $string); 
+3

我試過這種方法,它把我的「reír」變成了「re'ir」。 –

0

既然你」重新尋找特定的西班牙字符,您可以使用正則表達式來查找這些特定字符:

function stripaccents($string) 
{ 
    $replace = array('/é/','/í/','/ó/','/á/','/ñ/', '/ú/', '/ü/'); 
    $with = array('e','i','o','a', 'n', 'u', 'u'); 

    $newstring = preg_replace($replace, $with, $string); 

    return $newstring; 
} 

否則,您可以使用已提及的其他功能之一。

+0

謝謝!那個似乎工作! –

+0

@WandaEmbar,雖然你可能會更好地使用諸如[Patchwork UTF-8](https://github.com/tchwork/utf8)或[Stringy](https://github.com/danielstjules/Stringy)之類的庫。 。 –

0

我覺得你不需要

foreach ($replace as &$char) 
    { 
     $char = utf8_decode($char); 
    } 
    unset($char); 

因爲utf8_decode試圖2個字節值從$轉換代替爲1字節值

0

這裏是我使用的是定製的。

function remove_accents($str, $charset = 'utf-8') { 
    $str = htmlentities($str, ENT_NOQUOTES, $charset); 
    $str = preg_replace('#&([A-za-z])(?:acute|cedil|caron|circ|grave|orn|ring|slash|th|tilde|uml);#', '\1', $str); 
    $str = preg_replace('#&([A-za-z]{2})(?:lig);#', '\1', $str); 
    $str = preg_replace('#&[^;]+;#', '', $str); 
    return $str; 
}