【问题标题】:PHP Regex Cleaning of User Posts用户帖子的 PHP 正则表达式清理
【发布时间】:2011-08-22 16:32:23
【问题描述】:

我正在尝试使用正则表达式在 PHP 中清理用户提交的 cmets,但已经变得相当卡住和困惑!

是否可以使用正则表达式来:

  1. 删除重复两次以上的标点符号,以便:

    • OMG it was AWESOME!!!! 变为 OMG it was AWESOME!!
    • !!!!!!!!!!.........------ 变为 !!..--
    • !?!?!? 变为 !?
  2. 删除重复的词组单词(例如用户复制并粘贴了一条消息),因此:

    • spamspamspamspam 变为 spam
    • I love copy and paste. I love copy and paste. I love copy and paste. 变为 I love copy and paste.
  3. 删除超过 10 个大写字母的字母和空格集合:

    • I LOVE CAPITALS THEY ARE SO AWESOME 变为 I love capitals they are so awesome
    • GOOD that sounds 保持不变
  4. 您有什么建议吗?

这是针对学生系统的(因此至少有尝试整理他们发布的内容的冲动),尽管我不希望过滤它或阻止他们的消息,只是用一些正则表达式“纠正”它.

感谢您的宝贵时间,


编辑:

如果无法使用正则表达式(或与其他 PHP 混淆的正则表达式),你会怎么做?

【问题讨论】:

  • 不要试图从技术上解决沟通问题。你只能失败。
  • 我认为在这种情况下该错误是在用户级别
  • 我同意 Wadih 的评论,我不打算解决这个问题(我认为我不能),只是尝试执行一些有助于“限制”它的合理规则!

标签: php regex


【解决方案1】:

1:

// same punctuation repeated more than 2 times
preg_replace('#([?!.-])\1{2,}#', '$1$1', $string);

// sequence of different punctuations repeated more than one time
preg_replace('#([?!.-][?!.-]+?)\1+#', '$1', $string);

2:

// any sequence of characters repeated more than one time
preg_replace('#(.{2,}?)\1+#', '$1', $string);

3:

// sequence of uppercase letters and spaces
function tolower_cb($match) {
        return strtolower($match[0]);
}
preg_replace_callback('#([A-Z ]{10,})#', 'tolower_cb', $string);

在这里试试:http://codepad.org/iQsZ2vJ0

【讨论】:

  • +1 深思熟虑的答案。虽然对于#2 我会使用(.+?) 而不是(.*?)。以防止它匹配 0 次出现。
  • 这些真的非常好,它们的简单而有效给我留下了深刻的印象,一定会收藏这个页面!
  • 我只能想到哈姆雷特中的“Words words”那一行
  • 正则表达式是正确的,但我不会在真实的用户输入中使用它们。例如,#1 将转换“哦……不!”变成“哦……不!”和#2“可可”变成“coa”或“pom pom pi dou”变成“pom pi dou”。还有“的喀喀湖”?
  • 这是真的,也许我不会使用它们,我同意你提出的观点!
【解决方案2】:

一个好的经验法则是永远不要尝试“修复”用户输入。如果用户想在句子后键入 4 个感叹号,则允许它。没有太多的理由。

你应该更关心注入攻击而不是这样的事情。

【讨论】:

    猜你喜欢
    • 2010-12-31
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    • 2010-10-31
    • 1970-01-01
    • 2011-05-26
    相关资源
    最近更新 更多