将外来字符更改为正常的等效字符

Tho*_*ggi 31 php regex special-characters string-search

我正在使用PHP,我想知道是否有一种预定义的方式将外国字符转换为非外国替代品.

诸如ê,ë,é之类的字符都会产生'e'.
我正在寻找一个函数,它将获取一个字符串并返回它没有特殊字符.
任何想法将不胜感激!

Edg*_*ski 82

在找不到合适的转换器后,我创建了自己的系列,以满足我的需求,包括我最喜欢的西里尔语转换,默认情况下有很多变化.

function transliterateString($txt) {
    $transliterationTable = array('á' => 'a', 'Á' => 'A', 'à' => 'a', 'À' => 'A', '?' => 'a', '?' => 'A', 'â' => 'a', 'Â' => 'A', 'å' => 'a', 'Å' => 'A', 'ã' => 'a', 'Ã' => 'A', '?' => 'a', '?' => 'A', '?' => 'a', '?' => 'A', 'ä' => 'ae', 'Ä' => 'AE', 'æ' => 'ae', 'Æ' => 'AE', '?' => 'b', '?' => 'B', '?' => 'c', '?' => 'C', '?' => 'c', '?' => 'C', '?' => 'c', '?' => 'C', '?' => 'c', '?' => 'C', 'ç' => 'c', 'Ç' => 'C', '?' => 'd', '?' => 'D', '?' => 'd', '?' => 'D', '?' => 'd', '?' => 'D', 'ð' => 'dh', 'Ð' => 'Dh', 'é' => 'e', 'É' => 'E', 'è' => 'e', 'È' => 'E', '?' => 'e', '?' => 'E', 'ê' => 'e', 'Ê' => 'E', '?' => 'e', '?' => 'E', 'ë' => 'e', 'Ë' => 'E', '?' => 'e', '?' => 'E', '?' => 'e', '?' => 'E', '?' => 'e', '?' => 'E', '?' => 'f', '?' => 'F', 'ƒ' => 'f', '?' => 'F', '?' => 'g', '?' => 'G', '?' => 'g', '?' => 'G', '?' => 'g', '?' => 'G', '?' => 'g', '?' => 'G', '?' => 'h', '?' => 'H', '?' => 'h', '?' => 'H', 'í' => 'i', 'Í' => 'I', 'ì' => 'i', 'Ì' => 'I', 'î' => 'i', 'Î' => 'I', 'ï' => 'i', 'Ï' => 'I', '?' => 'i', '?' => 'I', '?' => 'i', '?' => 'I', '?' => 'i', '?' => 'I', '?' => 'j', '?' => 'J', '?' => 'k', '?' => 'K', '?' => 'l', '?' => 'L', '?' => 'l', '?' => 'L', '?' => 'l', '?' => 'L', '?' => 'l', '?' => 'L', '?' => 'm', '?' => 'M', '?' => 'n', '?' => 'N', '?' => 'n', '?' => 'N', 'ñ' => 'n', 'Ñ' => 'N', '?' => 'n', '?' => 'N', 'ó' => 'o', 'Ó' => 'O', 'ò' => 'o', 'Ò' => 'O', 'ô' => 'o', 'Ô' => 'O', '?' => 'o', '?' => 'O', 'õ' => 'o', 'Õ' => 'O', 'ø' => 'oe', 'Ø' => 'OE', '?' => 'o', '?' => 'O', '?' => 'o', '?' => 'O', 'ö' => 'oe', 'Ö' => 'OE', '?' => 'p', '?' => 'P', '?' => 'r', '?' => 'R', '?' => 'r', '?' => 'R', '?' => 'r', '?' => 'R', '?' => 's', '?' => 'S', '?' => 's', '?' => 'S', 'š' => 's', 'Š' => 'S', '?' => 's', '?' => 'S', '?' => 's', '?' => 'S', '?' => 's', '?' => 'S', 'ß' => 'SS', '?' => 't', '?' => 'T', '?' => 't', '?' => 'T', '?' => 't', '?' => 'T', '?' => 't', '?' => 'T', '?' => 't', '?' => 'T', 'ú' => 'u', 'Ú' => 'U', 'ù' => 'u', 'Ù' => 'U', '?' => 'u', '?' => 'U', 'û' => 'u', 'Û' => 'U', '?' => 'u', '?' => 'U', '?' => 'u', '?' => 'U', '?' => 'u', '?' => 'U', '?' => 'u', '?' => 'U', '?' => 'u', '?' => 'U', '?' => 'u', '?' => 'U', 'ü' => 'ue', 'Ü' => 'UE', '?' => 'w', '?' => 'W', '?' => 'w', '?' => 'W', '?' => 'w', '?' => 'W', '?' => 'w', '?' => 'W', 'ý' => 'y', 'Ý' => 'Y', '?' => 'y', '?' => 'Y', '?' => 'y', '?' => 'Y', 'ÿ' => 'y', 'Ÿ' => 'Y', '?' => 'z', '?' => 'Z', 'ž' => 'z', 'Ž' => 'Z', '?' => 'z', '?' => 'Z', 'þ' => 'th', 'Þ' => 'Th', 'µ' => 'u', '?' => 'a', '?' => 'a', '?' => 'b', '?' => 'b', '?' => 'v', '?' => 'v', '?' => 'g', '?' => 'g', '?' => 'd', '?' => 'd', '?' => 'e', '?' => 'E', '?' => 'e', '?' => 'E', '?' => 'zh', '?' => 'zh', '?' => 'z', '?' => 'z', '?' => 'i', '?' => 'i', '?' => 'j', '?' => 'j', '?' => 'k', '?' => 'k', '?' => 'l', '?' => 'l', '?' => 'm', '?' => 'm', '?' => 'n', '?' => 'n', '?' => 'o', '?' => 'o', '?' => 'p', '?' => 'p', '?' => 'r', '?' => 'r', '?' => 's', '?' => 's', '?' => 't', '?' => 't', '?' => 'u', '?' => 'u', '?' => 'f', '?' => 'f', '?' => 'h', '?' => 'h', '?' => 'c', '?' => 'c', '?' => 'ch', '?' => 'ch', '?' => 'sh', '?' => 'sh', '?' => 'sch', '?' => 'sch', '?' => '', '?' => '', '?' => 'y', '?' => 'y', '?' => '', '?' => '', '?' => 'e', '?' => 'e', '?' => 'ju', '?' => 'ju', '?' => 'ja', '?' => 'ja');
    return str_replace(array_keys($transliterationTable), array_values($transliterationTable), $txt);
}
Run Code Online (Sandbox Code Playgroud)

  • 这个阵列是救生员!我也使用下面的正则表达式替换,但它并不总是有效.现在我正在使用你的**$ transliterationTable**和正则表达式,而且没有特殊的char bug了!`$ string = preg_replace('〜&([az] {1,2})(acute | uml | circ | grave | ring | cedil | slash | tilde | caron | lig | quot | rsquo | orn | th);〜我','$ 1',$ string);` (5认同)
  • 每次使用`array_keys`和`array_values`调用此函数时,不是创建2个非常长的数组(后者实际上不需要,因为它通过直接传递数组工作正常),为什么不使用`strtr`?`return strtr($ txt,$ transliterationTable);` (2认同)

Ali*_*xel 12

我编写了这个函数,它使用PHP内置的HTML实体转换表来对字符进行罗马化:

function Unaccent($string)
{
    if (strpos($string = htmlentities($string, ENT_QUOTES, 'UTF-8'), '&') !== false)
    {
        $string = html_entity_decode(preg_replace('~&([a-z]{1,2})(?:acute|cedil|circ|grave|lig|orn|ring|slash|tilde|uml);~i', '$1', $string), ENT_QUOTES, 'UTF-8');
    }

    return $string;
}
Run Code Online (Sandbox Code Playgroud)

它通过应用htmlentities()然后删除常见实体后缀来工作,一个简单的例子:

 - ã = ã -> a
 - Ã = Ã -> A
 - õ = õ -> o
 - Õ = Õ -> O
 - æ = æ  -> ae
 - Æ = Æ  -> AE
Run Code Online (Sandbox Code Playgroud)

请注意,为了使其正常工作,您的文件需要以UTF-8编码(显然没有BOM).

另请参阅我的其他答案的另一个例子.


小智 12

我的第一个建议是iconv功能.也就是因为它内置于PHP中,所以不需要任何外部或第三方库.此外,它是一个专门用于完成您要完成的功能的函数(接受字符集作为输入,并输出备用字符集,特别是从UTF-8到ASCII).以下是如何调用此函数的示例:

$clean_ascii_output = iconv('UTF-8', 'ASCII//TRANSLIT', $utf8_input);
Run Code Online (Sandbox Code Playgroud)

有关此PHP函数细节的更多信息,请访问:http://php.net/manual/en/function.iconv.php

注意:iconv函数接受字符串输入,因此您需要迭代数据,并解析它以便传入字符串输入.

  • 就我而言,此方法将它们替换为 '?' 人物。 (2认同)