在這個 SEO 當道的年代,簡單易懂的現代網址已經是基本常識了。根據 W3C 的網址規定,合法字元僅有 A – Z, a – z, 0 – 9, -, ., _, ~, :, /, ?, #, [, ], @, !, $, &, ‘, (, ), *, +, ,, ; = ,而且橫線 ( – ) 之後都是有特別意義的保留字,所以過去常看到亂七八糟的亂碼網址,像是本文的標題不處理的話就變….
How%20to%40%20Convert%20String%20to%20Slug
雖然對電腦來說沒什麼差別,但是對人類來說卻是難以理解、難以記憶的無意義片段。
為了將亂七八糟的網址統一成電腦可讀,人類可讀,而且容易被搜尋引擎找到的型式,出現了 slug 這樣的慣例。Slug 的規則一般來說是先濾除非英、數字的字元,中文、日文都先 bye 了;接著全部文字轉為小寫;再將常見於歐洲語系的重音或連音字母換成對應的英文字母;再將空白、橫線、底線全部換成橫線 (dashes) 或底線 (underscores),二選一,最後去掉可能出現在頭尾的橫線或底線。以本文的標題來說,slug 就是這樣:
how-to-convert-string-to-slug
以下分別提供 PHP 與 JavaScript 轉換 slug 的範例,這兩種寫法是參考了很多篇網路文章,再加上一些心得修改而成。
<?php
$origin_str = ' -++-- How 2009 áäâèéëêìíïîò ANT 許功蓋中文 To Use PHP Regex?';
function slug($str){
$str = trim(strtolower($str)); // 轉為小寫,去除頭尾空白
$str = remove_accents($str); // 去除重音字母
$str = preg_replace('/[^a-z0-9-]/', '-', $str); // 將英、數以外的字元轉換成橫線
$str = preg_replace('/-+/', "-", $str); // 去除連續的橫線
return trim($str, '-'); // 再次去除頭尾的橫線
}
function remove_accents($str){
$search = explode(",","ç,æ,œ,á,é,í,ó,ú,à,è,ì,ò,ù,ä,ë,ï,ö,ü,ÿ,â,ê,î,ô,û,å,e,i,ø,u");
$replace = explode(",","c,ae,oe,a,e,i,o,u,a,e,i,o,u,a,e,i,o,u,y,a,e,i,o,u,a,e,i,o,u");
return str_replace($search, $replace, $str);
}
echo "<pre>".slug($origin_str)."</pre>";
?>
#output=> how-2009-aaaeeeeiiiio-ant-to-use-php-regex
JavaScript 的版本如下:
<div class="output"></div>
<script type="text/javascript">
function slug(str) {
str = str.replace(/^\s+|\s+$/g, ''); // trim
str = str.toLowerCase();
// remove accents, swap ñ for n, etc
var from = "àáäâèéëêìíïîòóöôùúüûñýÿç·/_,:;";
var to = "aaaaeeeeiiiioooouuuunyyc------";
for (var i=0, l=from.length ; i<l ; i++) {
str = str.replace(new RegExp(from.charAt(i), 'g'), to.charAt(i));
}
str = str.replace(/[^a-z0-9 -]/g, '') // remove invalid chars
.replace(/\s+/g, '-') // collapse whitespace and replace by -
.replace(/-+/g, '-') // collapse dashes
.replace(/^-/g, '');
return str;
}
// jQuery 的輸出
$('div.output').html(
slug(' -++-- How 2009 áäâèéëêìíïîò ANT 許功蓋中文 To Use PHP Regex?')
);
</script>
PHP 與 JavaScript 的輸出結果是一樣的,如下。
how-2009-aaaeeeeiiiio-ant-to-use-php-regex
Leave a Reply Cancel reply