我需要做什么才能打开带有特殊字符的 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;
}
您好,我正在尝试使用 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;
}