我需要做什么才能打开带有特殊字符的 URL

What I need to do in order to open URLs with special characters

您好,我正在尝试使用 php 使 seo 友好 url。我正在使用以下代码将 url 转换为 exapmle.com/post/hi-how-are-you 并使用此 .htaccess 代码

RewriteRule ^post/([\w-]+)/?$ single_post.php?blog_title= [L,QSA]

php 鼻涕虫 url

function url_slug($str) {   
    $str = mb_strtolower(trim($str), 'UTF-8');
    $str = preg_replace('/[[:^alnum:]]/iu', ' ', $str);
    $str = trim($str);
    $str = preg_replace('/\s+/', '-', $str);
    return $str;
}

但问题是特殊字符。例如:当我 post 像 (tırda bir öğün çok çıktı) 这样的土耳其语字符时,url 看起来像这样

example.com/post/tırda-bir-öğün-çok-çıktı

slug 一切正常,但是当我打开 url 时,我无法使用 (tırda-bir-öğün-çok-çıktı) 获取任何数据。

我需要做什么才能打开带有特殊字符的 URL?

我们有机会用英文打印所有特殊字符吗?就像当我 post 来自数据的东西时 url_slug 可以将特殊字符更改为英文字符,例如:

tırda bir öğün çok çıktı

转换后的英文字符

tirda-bir-ogun-cok-cikti

最常见的方法是使用一些映射,其中您有 non-latin 字母作为键和拉丁字母表示:

$map = [
   'š' => 'sh',
   ...
];

然后你使用替换:

str_replace(array_keys($map), array_values($map), $slug);

另一种方法是使用 iconv 函数:

iconv('UTF-8', 'ASCII//TRANSLIT', $slug);

\w 仅匹配单词字符为 [a-zA-Z0-9_] 且不包括所有 unicode 字符的单词字符。

将您的规则更改为:

RewriteRule ^post/([^/]+)/?$ single_post.php?blog_title= [L,QSA]

[^/]+ 将匹配任何非 / 的字符,包括 unicode 字符。

您也可以稍微调整 php 代码:

function url_slug($str) {   
    $str = mb_strtolower(trim($str), 'UTF-8');
    $str = preg_replace('/[^\pL\pN]+/u', ' ', $str);
    $str = trim($str);
    $str = preg_replace('/\h+/', '-', $str);
    return $str;
}