我想要转换带有特殊字符的字符串。通常我会手动找到所有特殊字符及其“网络安全”对应部分并将它们放入数组中。然后我使用 preg_replace 替换每个字符。
但我不禁想到有一个更简单的解决方案,因为它是错误修剪方法。
这是我想要的一个例子:
Hans Günther -> hans-gunther
Jären höst -> jaeren-hoest
René Ågesen -> rene-aagesen
最佳答案
字符串 urlencode (字符串 $str)
http://php.net/manual/en/function.urlencode.php
实际上,这是一篇很棒的文章,关于将上面示例中的文本转换为漂亮的 url 安全字符串(可能比上面的函数更适合你):
http://cubiq.org/the-perfect-php-clean-url-generator
setlocale(LC_ALL, 'en_US.UTF8');
function toAscii($str, $replace=array(), $delimiter='-') {
if( !empty($replace) ) {
$str = str_replace((array)$replace, ' ', $str);
}
$clean = iconv('UTF-8', 'ASCII//TRANSLIT', $str);
$clean = preg_replace("/[^a-zA-Z0-9\/_|+ -]/", '', $clean);
$clean = strtolower(trim($clean, '-'));
$clean = preg_replace("/[\/_|+ -]+/", $delimiter, $clean);
return $clean;
}
以下是它的作用示例:
echo toAscii("Mess'd up --text-- just (to) stress /test/ ?our! `little` \\clean\\ url fun.ction!?-->");
returns: messd-up-text-just-to-stress-test-our-little-clean-url-function
echo toAscii("Perché l'erba è verde?", "'"); // Italian
returns: perche-l-erba-e-verde
echo toAscii("Peux-tu m'aider s'il te plaît?", "'"); // French
returns: peux-tu-m-aider-s-il-te-plait
echo toAscii("Tänk efter nu – förr'n vi föser dig bort"); // Swedish
returns: tank-efter-nu-forrn-vi-foser-dig-bort
echo toAscii("ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöùúûüýÿ");
returns: aaaaaaaeceeeeiiiidnooooouuuuyssaaaaaaaeceeeeiiiidnooooouuuuyy
echo toAscii("Custom`delimiter*example", array('*', '`'));
returns: custom-delimiter-example
echo toAscii("My+Last_Crazy|delimiter/example", '', ' ');
returns: my last crazy delimiter example
如果您想将 ä 转换为 ae 等,您可以使用这样的脚本(抱歉,不知道有什么更好的方法):
setlocale(LC_ALL, 'de_DE');
$replace = array(
'illegal' => array('/Ä/', '/Ö/', '/Ü/', '/ä/', '/ö/', '/ü/', '/Â/', '/é/'),
'legal' => array('Ae', 'Oe', 'Ue', 'ae', 'oe', 'ue', 'Aa', 'e')
);
$string = 'ich hätte gerne brötechen Mein Name ist Öles Âlex';
echo preg_replace($replace['illegal'], $replace['legal'], $string);
//Output: "ich haette gerne broetechen Mein Name ist Oeles Aalex"
您显然可以像这样将它们放在一起(仅转换 ü->ue 等,只需在第一个 preg_replace 中添加更多内容):
setlocale(LC_ALL, 'en_US.UTF8');
function toAscii($str, $replace=array(), $delimiter='-') {
if( !empty($replace) ) {
$str = str_replace((array)$replace, ' ', $str);
}
$clean = preg_replace(array('/Ä/', '/Ö/', '/Ü/', '/ä/', '/ö/', '/ü/'), array('Ae', 'Oe', 'Ue', 'ae', 'oe', 'ue'), $str);
$clean = iconv('UTF-8', 'ASCII//TRANSLIT', $clean);
$clean = preg_replace("/[^a-zA-Z0-9\/_|+ -]/", '', $clean);
$clean = strtolower(trim($clean, '-'));
$clean = preg_replace("/[\/_|+ -]+/", $delimiter, $clean);
return $clean;
}
$text = "Hätten Sie gerne viele Brötchen? Wenn ja dann einfach *!@#$%^&*()eingeben...";
echo toAscii($text);
//OUTPUT: haetten-sie-gerne-viele-broetchen-wenn-ja-dann-einfach-eingeben
关于php - 将字符串转换为网络安全 URI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4783802/