2011-08-15 18 views
1

我知道這個問題已被問過幾次肯定,但我有我的正則表達式的問題......所以這裏是我想要在PHP中做的(簡單)事情:替換PHP字符串中的選定字符

我想做一個函數來替換字符串中不需要的字符。接受的字符應該是: a-z A-Z 0-9 _ - +(){}#äöüÄÖÜ空格

我希望所有其他字符變成「_」。下面是一些示例代碼,但我不知道是什麼填補了?????:

<?php 

// sample strings 
$string1 = 'abd92 s_öse'; 
$string2 = 'ab! sd$ls_o'; 

// Replace unwanted chars in string by _ 
$string1 = preg_replace(?????, '_', $string1); 
$string2 = preg_replace(?????, '_', $string2); 

?> 

輸出應該是: $字符串1:abd92s_öse(下同) $字符串2:ab_ sd_ls_o

我能夠使它適用於az,0-9,但它可以很好地允許這些額外的字符,尤其是äöü。感謝您的輸入!

回答

2

爲了讓您只說明確切的字符:

$str = preg_replace("/[^a-zA-Z0-9_+(){}#äöüÄÖÜ -]/", "_", $str); 

要允許所有空白,而不僅僅是(空格)字符:

$str = preg_replace("/[^a-zA-Z0-9_+(){}#äöüÄÖÜ\s-]/", "_", $str); 

爲了讓來自不同字母表的字母 - 不僅僅是你提到的具體的,但還搞什麼俄羅斯和希臘,或其他類型的重音符號的:

$str = preg_replace("/[^\w+(){}#\s-]/", "_", $str); 

如果我是你,我會和最後一個一起去。它不僅更短,更易於閱讀,而且限制也更少,如果äöüÄÖÜ都沒有問題,阻止像и這樣的東西沒有什麼特別的優勢。

+0

我不確定,因爲我會通過瀏覽器的URL傳遞這些字符串。允許更多特殊字符可能會導致問題,你不覺得嗎? – andreas

+1

@andreas - 在這種情況下,如果它們是查詢字符串的一部分,請考慮將它們傳遞給** ['urlencode'](http://php.net/manual/en/function.urlencode.php)**。如果他們不這樣做,無論如何''äöüÄÖÜ''都會給你帶來問題。通常情況下,'и'和其他非ASCII字母在任何可以使用''äöüÄÖÜ''的地方都很好,因爲那些字母也不是ASCII。 –

+0

因此,基本上,如果您可以使用'äöüÄÖÜ',那麼''и','φ','''或其他來自非拉丁字母的其他字母不應該有問題。 –

1

[^a-zA-Z0-9_\-+(){}#äöüÄÖÜ ]替換爲_

$string1 = preg_replace('/[^a-zA-Z0-9_\-+(){}#äöüÄÖÜ ]/', '_', $string1); 

這在[字符集] ^替換後的項目除外的任何字符

編輯:逃過-衝刺。

+1

中間部分'_- +',是錯誤的。這將試圖找到'_'和'+'之間的範圍。如果你想從字面上理解,你需要將'-'移到字符類的開頭或結尾。 –

+0

赫赫謝謝,我已經想知道爲什麼會出現錯誤(警告:preg_replace()[function.preg-replace]:編譯失敗:在/ home/www/action.php的偏移13處的字符類中的順序不正確52) – andreas