背景:在我所做的幾個專案過程中,屢次涉及到用一個字串去生成一個合法的連結字串的需求。
比如:根據產品名、活動名、部落格標題等等。
我的第一反應是正則替換,而且php
也提供了很多的字串函式可以去處理這種問題,比如:trim
系列,str_replace
等等。
但是,無論是正則替換還是內建函式,都不得不面對特殊字元到底都有哪些的問題,也就是特殊字元的資料樣本無法預估。於是我反其道行之,利用字串遍歷以及一個合法連結的字元構成而去實現這個需求。
大概思路:先對字串進行空格替換處理,然後進行字串遍歷,最後去除中間連續多個的替換字元。
由於我接到的需求是生成一個合法的連結字串,並且把特殊字元及空格替換為中劃線:-
,所以預設替換字元是中劃線。
廢話不多說,程式碼如下:
function makeUrl($str, $replacement = '-')
{
$str = preg_replace('/\s+/', $replacement, $str);
$newStr = '';
$len = strlen($str);
for ($i = 0; $i < $len; $i++) {
if (preg_match('/[0-9a-zA-Z]/', $str[$i])) {
$newStr .= $str[$i];
} else {
$newStr .= $replacement;
}
}
return trim(preg_replace('/-+/', $replacement, $newStr), $replacement);
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結