【问题标题】:PHP RegEx Remove words from string which contain non-letters/numbersPHP RegEx 从包含非字母/数字的字符串中删除单词
【发布时间】:2012-03-15 13:57:58
【问题描述】:

谁能帮我解决这个正则表达式,因为我不知道如何实现它。

我需要一个正则表达式来从字符串中删除所有单词,这些单词至少包含一个不是 UTF-8 字母或数字的字符,或者单词中间的标点符号(但不是结尾)。

例子:

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

第一个示例包含®,它不是字母、数字或标点符号。 第二个示例在中间包含标点符号。

我需要删除这些坏词,但保持字符串的其余部分完好无损。例如。 This is string, A bad is here.

请注意A bad string? is here 不会包含任何不好的词,因为标点符号在词尾。

提前感谢您的帮助。

【问题讨论】:

  • 除了英语还有其他语言吗?因为UTF-8 letter or number 需要php.net/manual/en/regexp.reference.unicode.php 可能并非所有地方都支持。
  • 可以包含重音字符,拉丁字母表中的任何字符,包括重音符号。但可以排除东方、俄罗斯、希腊等字符。

标签: php regex


【解决方案1】:

这个怎么样:

$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);

【讨论】:

  • 谢谢,但如果单词以非字母字符开头,这将不匹配。当数字应该没问题时,这也会认为数字不好。
  • @Alasdair:我忽略了数字部分 - 现在修复它。你写了“包含一个...字符在单词中间”,这不包括我解释中的第一个字母。那么具体的规则是什么呢?
  • @TimPietzcker 我认为 PHP 对于 7 个单字母通用类别属性不需要大括号。我认为这是你需要这些的 C♯。我更喜欢\pL 仅比\w 长一半的系统,而不是\p{L} 的系统,后者的大小是\p{L} 的2.5 倍,而且看起来很乱。但我知道有些人认为大括号有助于他们更好地阅读。
猜你喜欢
  • 2018-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多