如何从文本中删除变音符号?

时间:2009-11-20 12:50:55

标签: php regex preg-replace diacritics

我正在制作瑞典语网站,瑞典语字母是å,ä和ö。

我需要创建一个由用户输入的字符串,以便使用PHP成为url-safe。

基本上,需要将所有字符转换为下划线,除了这些外:

 A-Z, a-z, 1-9

并且所有瑞典语应该像这样转换:

'å'到'a'和'ä'到'a'和'ö'到'o'(只需删除上面的点)。

正如我所说,其余部分应该成为下划线。

我不擅长正则表达式,所以我很感激帮助人员!

由于

注意:不是URLENCODE ...我需要将它存储在数据库......等等,urlencode对我不起作用。

9 个答案:

答案 0 :(得分:20)

使用iconv将给定编码的字符串转换为ASCII,然后使用preg_replace替换非字母数字字符:

$input = 'räksmörgås och köttbullar'; // UTF8 encoded
$input = iconv('UTF-8', 'ASCII//TRANSLIT', $input);
$input = preg_replace('/[^a-zA-Z0-9]/', '_', $input);
echo $input;

结果:

raksmorgas_och_kottbullar

答案 1 :(得分:19)

这对处理几乎所有情况都很有用。

function Unaccent($string)
{
    return preg_replace('~&([a-z]{1,2})(?:acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml|caron);~i', '$1', htmlentities($string, ENT_COMPAT, 'UTF-8'));
}

答案 2 :(得分:13)

// normalize data (remove accent marks) using PHP's *intl* extension
$data = normalizer_normalize($data);

// replace everything NOT in the sets you specified with an underscore
$data = preg_replace("#[^A-Za-z1-9]#","_", $data);

答案 3 :(得分:7)

  

并且所有瑞典语应该像这样转换:

     

'å'到'a'和'ä'到'a'和'ö'到'o'(只需删除上面的点)。

使用normalizer_normalize()删除diacritical marks

  

正如我所说,其余部分应该成为下划线。

使用preg_replace()模式[\W](i.o.w:任何与字母,数字或下划线不匹配的字符)以下划线替换它们。

最终结果应如下所示:

$data = preg_replace('[\W]', '_', normalizer_normalize($data));

答案 4 :(得分:4)

如果您只想使URL安全,那么您需要urlencode

  

返回一个全部的字符串   除-_之外的非字母数字字符。   已被替换为百分比(%)   标志后跟两个十六进制数字和   空格编码为加号(+)。它   以与编码相同的方式编码   从WWW表单发布的数据是   编码,与in中的方式相同   应用程序/ x-WWW窗体-urlencoded   媒体类型。这与»   RFC 1738编码(参见rawurlencode())   因为历史原因,空间   被编码为加号(+)。

如果你真的想要去除所有非A-Z,a-z,1-9(顺便说一下0有什么问题?),那么你想要:

$mynewstring = preg_replace('/[^A-Za-z1-9]/', '', $str);

答案 5 :(得分:2)

就像

一样简单
 $str = str_replace(array('å', 'ä', 'ö'), array('a', 'a', 'o'), $str); 
 $str = preg_replace('/[^a-z0-9]+/', '_', strtolower($str));

假设您对数据和代码使用相同的编码。

答案 6 :(得分:1)

一个简单的解决方案是使用str_replace函数搜索并替换字母数组。

答案 7 :(得分:0)

您不需要花哨的正则表达式来过滤瑞典语字符,只需使用strtr function来“翻译”它们,例如:

$your_URL = "www.mäåö.com";
$good_URL = strtr($your_URL, "äåöë etc...", "aaoe etc...");
echo $good_URL;

- >输出:www.maao.com:)

答案 8 :(得分:0)

如果启用了intl php扩展,您可以像这样使用Transliterator:

protected function removeDiacritics($string)
{
    $transliterator = \Transliterator::create('NFD; [:Nonspacing Mark:] Remove; NFC;');
    return $transliterator->transliterate($string);
}

删除其他特殊字符(不是像'æ'那样的变音符号)

protected function removeDiacritics($string)
{
    $transliterator = \Transliterator::createFromRules(
        ':: Any-Latin; :: Latin-ASCII; :: NFD; :: [:Nonspacing Mark:] Remove; :: NFC;',
        \Transliterator::FORWARD
    );
    return $transliterator->transliterate($string);
}