2011-04-16 71 views
26

比方說,我有這樣的:PHP帶標點符號

$hello = "Hello, is StackOverflow a helpful website!? Yes!"; 

,我想要去除標點符號,因此輸出爲:

hello_is_stackoverflow_a_helpful_website_yes 

我怎麼能這樣做?

回答

46
# to keep letters & numbers 
$s = preg_replace('/[^a-z0-9]+/i', '_', $s); # or... 
$s = preg_replace('/[^a-z\d]+/i', '_', $s); 

# to keep letters only 
$s = preg_replace('/[^a-z]+/i', '_', $s); 

# to keep letters, numbers & underscore 
$s = preg_replace('/[^\w]+/', '_', $s); 

# same as third example; suggested by @tchrist; ^\w = \W 
$s = preg_replace('/\W+/', '_', $s); 

字符串

$s = "Hello, is StackOverflow a helpful website!? Yes!"; 

結果(所有的例子)是

Hello_is_StackOverflow_a_helpful_website_Yes_

享受!

+0

嗯......但如果我有'你好,世界'當有假設是空間不是一個下劃線我會得到'hello__world' ...二! 。 – nn2 2011-04-16 22:24:09

+0

我明白了,nvm。謝謝! – nn2 2011-04-16 22:31:44

+1

多寫一個'\ W'! – tchrist 2011-04-16 22:47:08

14
function strip_punctuation($string) { 
    $string = strtolower($string); 
    $string = preg_replace("/[:punct:]+/", "", $string); 
    $string = str_replace(" +", "_", $string); 
    return $string; 
} 

首先將字符串轉換爲小寫,然後標點被去除,然後空格替換爲下劃線(這將處理一個或多個空格,因此,如果有人將兩個空間,將只由一個下劃線來代替)。

+0

是不是'\ pP'指定標點符號的現代方式? – tchrist 2011-04-16 22:47:38

+0

@tchrist最具兼容性和可讀性的方式(貫穿POSIX,GNU和PCRE regexp)是使用像'[:alnum:]'和'[:punct:]'這樣的POSIX字符類。 '\ pP'依賴Unicode的東西,idk如何在PHP中起作用,因爲PHP具有糟糕的unicode支持。 – 2011-04-16 22:51:54

+2

如果你想*可讀*,那麼你應該使用完整的屬性名稱:'\ p {General_Category =標點符號}',通常縮寫爲''p'標點符號''的二進制屬性。不幸的是PCRE沒有很好的Unicode屬性支持。我永遠不會信任POSIX charclasses的原因是因爲它們根據供應商的語言環境和用戶設置太容易破壞。即使這是[UTS#18的RL1.2](http://unicode.org/reports/tr18/#Compatibility_Properties)所要求的,它幾乎不會正確處理Unicode。我不信任和不喜歡任何不支持Unicode的東西。 – tchrist 2011-04-16 23:02:21

3

我會像這樣的東西去:

$str = preg_replace('/[^\w\s]/', '', $str); 

我不知道這是不是你正在尋找更廣闊的,但它聽起來就像你正在試圖做什麼。

我也注意到你在你的示例中用空格替換了下劃線。我使用的代碼是:

$str = preg_replace('/\s+/', '_', $str); 

請注意,這也會將多個空格合併爲一個下劃線。

10

沒有正則表達式:

<?php 
    $hello = "Hello, is StackOverflow a helpful website!? Yes!"; // original string 
    $unwantedChars = array(',', '!', '?'); // create array with unwanted chars 
    $hello = str_replace($unwantedChars, '', $hello); // remove them 
    $hello = strtolower($hello); // convert to lowercase 
    $hello = str_replace(' ', '_', $hello); // replace spaces with underline 
    echo $hello; // outputs: hello_is_stackoverflow_a_helpful_website_yes 
?>