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

时间:2018-04-05 14:46:56

标签: php mysql .htaccess slug

您好我正在尝试使用php制作一个seo友好的网址。我正在使用以下代码转换网址-i并使用此.htaccess代码

exapmle.com/post/hi-how-are-you

php slug url

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

但问题是特殊性。例如:当我发布一些turkih字符像(tırdabiröğünçokçıktı)时,网址看起来像这样

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;
}

一切都没关系,但当我打开网址时,我无法使用(tırda-bir-öğün-çok-çıktı)获取任何数据。

打开包含特殊字符的网址需要做些什么?

我们是否有机会用英语打印所有特殊字符?就像我从数据中发布内容时,url_slug可以将特殊字符更改为英文字符,例如:

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

转换后的英文字符

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

2 个答案:

答案 0 :(得分:1)

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

将您的规则更改为:

RewriteRule ^post/([^/]+)/?$ single_post.php?blog_title=$1 [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;
}

答案 1 :(得分:0)

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

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

然后你使用replace:

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

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

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