2012-02-25 33 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

相关问题