17

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

我需要使用户输入的字符串在 PHP 中成为 url 安全的。

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

 A-Z, a-z, 1-9

所有瑞典语都应该这样转换:

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

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

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

谢谢

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

4

9 回答 9

25

这应该很有用,可以处理几乎所有的情况。

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'));
}
于 2012-10-12T09:14:25.870 回答
23

使用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
于 2009-11-20T13:21:28.033 回答
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);
于 2009-11-20T13:02:50.343 回答
8

所有瑞典语都应该这样转换:

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

用于normalizer_normalize()摆脱变音符号

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

preg_replace()[\W](iow: 任何不匹配字母、数字或下划线的字符)的模式一起使用以用下划线替换它们。

最终结果应如下所示:

$data = preg_replace('[\W]', '_', normalizer_normalize($data));
于 2009-11-20T12:56:38.530 回答
5

如果启用了 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);
}
于 2017-11-13T16:35:49.687 回答
4

如果您只是对确保 URL 安全感兴趣,那么您需要urlencode.

返回一个字符串,其中包含除 -_ 之外的所有非字母数字字符。已替换为百分号 (%) 后跟两个十六进制数字和编码为加号 (+) 的空格。它的编码方式与 WWW 表单中发布的数据的编码方式相同,即与 application/x-www-form-urlencoded 媒体类型中的方式相同。这与 » RFC 1738 编码(参见 rawurlencode())的不同之处在于,由于历史原因,空格被编码为加号 (+)。

如果您真的想剥离所有非 AZ, az, 1-9 (0顺便说一句,有什么问题?),那么您想要:

$mynewstring = preg_replace('/[^A-Za-z1-9]/', '', $str);
于 2009-11-20T12:53:16.343 回答
2

简单到

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

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

于 2009-11-20T13:03:06.823 回答
1

一种简单的解决方案是将str_replace函数与搜索和替换字母数组一起使用。

于 2009-11-20T13:02:01.593 回答
0

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

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

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

于 2009-11-20T13:02:59.843 回答