2013-04-27 38 views
1

我想將所有非字母數字字符都轉換成連字符( - )(破折號)作爲高雅的URL。爲此我使用下面的方法:如何將字符串的所有非字母數字字符轉換爲連字符?

$title = 'Any Authentic PHP Script/Third Party & @ 10 $ tool to'; 
$title .= 'Convert HTML to BBcode, BBcode to HTML'; 
$url = preg_replace("/[^0-9a-zA-Z ]/m", "", $title); 
$url = preg_replace("/ /", "-", $url); 

它輸出以下:

Any-Authentic-PHP-Script--Third-Party---10--tool-to-Convert-HTML-to-BBcode-BBcode-to-HTML 

但是,正如你可能已經注意到,有一些不期望的雙連字符(--)和一些三重連字符。 (--)。每個單詞之間只需要一個連字符。我怎樣才能實現我的目標?

+0

重複的問題 - http://stackoverflow.com/a/6979888/2106973 – 2013-04-27 13:15:24

回答

5

爲您的代碼,只需更換

$url = preg_replace("/ /", "-", $url); 

$url = preg_replace("/\s+/", "-", $url); 

而且讓所有的空間(和標籤等)轉換爲只有一個連字符。 \s表示任意空格字符,並且+表示以前的一個或多個令牌

但是,您可以做得更好。 你的正則表達式替換成一個preg_replace

$url = preg_replace("/\W+/m", "-", $title); 

...因爲\W恰恰意味着非字母數字字符。

另外,如果你也不想在結果下劃線(_),使用

$url = preg_replace("/[\W_]+/m", "-", $title); 

作爲一個側面說明,接下來的時間,如果你真的想這樣做

preg_replace("/ /", "-", $url); 

請做到這一點,而不是

str_replace(" ", "-", $url); 

因爲str_replacepreg_replace快得多,而且甚至從PHP文檔建議:

http://php.net/manual/en/function.str-replace.php

如果你不需要花哨更換的規則(比如正則表達式),你應該始終使用此函數,而不是preg_replace()。

+2

不應該使用'[\ W _] +',因爲\ W +不會匹配下劃線? – Jerry 2013-04-27 13:10:20

+0

非常好。謝謝。 – 2013-04-27 13:12:27

+0

@傑裏指出,包括在我的答案 – luiges90 2013-04-27 13:14:24

2

這是因爲首先非字母數字字符被刪除,所以你的字符串變成

Any Authentic PHP Script Third Party 10 tool to 

你看到它已經離開雙空間的一些地方。

只是這樣做:

preg_replace("/[^a-zA-Z0-9]+/", "-", $subject); 

它取代的一個或多個非字母數字字符所有出現一個單一的破折號。

+0

你的代碼中有一個錯字,應該是A-Z而不是A-A – 2014-02-19 10:26:00

+0

@KevinVandenborne謝謝!固定! – 2014-02-19 15:33:09

相關問題