2012-02-25 29 views
0

任何人都可以請幫我這個正則表達式,因爲我不知道如何實現它。PHP正則表達式取下字符串包含非字母的單詞/數字

我需要一個正則表達式來刪除字符串中至少包含一個不是UTF-8字母或數字的字符的所有單詞,或者在單詞的中間(但不在末尾)標點符號。

實例:

This is ®Aix string 
A bad str?ng is here 

第一個例子包含®,這不是一個字母,數字或標點。 第二個示例在中間包含標點符號。

我需要刪除這些不好的話,但保留完整的字符串的其餘部分。例如。 This is stringA bad is here

請注意,A bad string? is here將不包含任何壞的話,因爲標點符號是在單詞的末尾。

非常感謝您的幫助。

+0

你有其他語言,除了英語?因爲'UTF-8字母或數字'需要http://www.php.net/manual/en/regexp.reference.unicode.php,這可能在任何地方都不受支持。 – Cheery 2012-02-25 07:59:44

+0

可以包含重音字符,包括重音符號在內的任何拉丁字母。但東方,俄羅斯,希臘等字符可以排除在外。 – Alasdair 2012-02-25 08:28:15

回答

2

如何:

$result = preg_replace(
    '/\b   # Start of word 
    [\p{L}\p{N}]+ # One or more Unicode letters 
    [^\s\p{L}\p{N}] # One non-letter (and non-whitespace), followed by 
    [^\s\p{P}]+  # at least one non-whitespace, non-punctuation character 
    \b    # End of word 
    \s*    # optional following whitespace 
    /xu', 
    '', $subject); 
+0

謝謝,但如果單詞以非字母字符開頭,則不匹配。當這些數字應該沒問題時,這也會將數字視爲不好。 – Alasdair 2012-02-25 08:27:00

+0

@Alasdair:我忽略了數字部分 - 現在就修好了。你寫了「在字中間包含一個......字符*」,它排除了我解釋中的第一個字母。那麼規則究竟是什麼? – 2012-02-25 13:28:53

+0

@TimPietzcker我在想,PHP並不需要爲7個單字母一般類別性的判定括號。我認爲這是C♯你需要那些。我更喜歡系統中'\ pL'是隻對了一半又長於'\ w',而不是那些以'\ p {L}',它是2.5倍的大小和變得混亂來看待。但我知道有些人認爲大括號可以幫助他們更好地閱讀。 – tchrist 2012-02-25 14:49:27

相關問題