php - 用非字母数字重复清理字符串

标签 php regex

当(有创意的)用户试图通过一些非字母数字的重复来“吸引注意力”时,我需要清理文章标题。

例子:

  • 买我的产品!!!!!!!!!!!!!!!!!!!!!!
  • 购买我的产品!? !? !? !? !? !?
  • 买我的产品!!!!!!!!!.......!!!!!!!
  • 购买我的产品<------------

一些可接受的解决方案是将非字母数字的重复次数减少到 2。

所以我会得到:

  • 买我的产品!!
  • 购买我的产品!? !?
  • 买我的产品!!..!!
  • 购买我的产品<--

此解决方案效果不佳:

preg_replace('/(\W{2,})(?=\1+)/', '', $title)

知道如何在 PHP 中使用正则表达式吗?

也欢迎其他更好的解决方案(我不能删除所有非字母字符,因为它们有意义)。

编辑:目的只是为了避免最常见的问题。其他创意案例将手动清理或使用其他正则表达式清理。

最佳答案

这确实是一个用正则表达式解决的低效问题,尤其是当重复的表达式任意大时。实际上,将重复表达式的长度限制在 3 到 5 左右就足够了,而且应该容易得多。

有点像

$title = preg_replace('/(\W{1,5})(?=\1+)/', '', $title);

应该可以。

一些初步测试表明

$title = 'Buy my product !!!!!!!!!!!!!!!!!!!!!!!! Buy my product !? !? !? !? !? !? Buy my product !!!!!!!!!.......!!!!!!!! Buy my product <-----------';

$title = preg_replace('/(\W{1,5})(?=\1{2,})/', '', $title);

echo $title;

会输出

Buy my product !! Buy my product !? !? Buy my product !!..!! Buy my product <--

这似乎通过了所有测试用例。


回复:戈登

你的字符串:

¸·´`·¸·´`·¸·´`·¸ Human ·-> creativity << is endless !¡!¡! ☻☺

除了第一部分之外,没有重复任何内容超过两次。似乎需要:

$title = preg_replace('/(\W{1,9})(?=\1{2,})/', '', $title);

在它简化为

之前
¸·´`·¸·´`·¸ Human ·-> creativity << is endless !¡!¡! ☻☺

(这意味着 preg_replace 不支持 Unicode - 好吧)

你也可以调整它只重复一次:

$title = preg_replace('/(\W{1,9})(?=\1+)/', '', $title);

在这种情况下它变成:

¸·´`·¸ Human ·-> creativity < is endless !¡! ☻☺

如果您的观点是即使需要重复少于两次,也可以创建很多“ASCII 艺术”,那么,这超出了本问题的范围。为了将 ASCII 艺术保持在最低限度,我建议简单地使用类似的东西:

preg_replace('/(\W{5})\W+/', '$1', $title);

(即只限制可以在一行中显示的非字母数字字符的数量。请注意,这需要进行调整以兼容非拉丁字母的语言,例如俄语。)

关于php - 用非字母数字重复清理字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2532501/

相关文章:

php - Mysql_fetch_data 意外打印

regex - 使用 perl 表达式批量重命名文件

php - 使用 PHP(正则表达式)解析内容占位符

php - 如何使用PHP数组模拟SQL LEFT JOIN操作?

php - 在codeigniter中将数据库数据转换为json

regex - 有没有办法从 Google 表格中的多行中查找并删除日期时间?

c# - 如何将整个字符串与正则表达式匹配?

android - 使用包含括号 '(' 的正则表达式从字符串中提取子字符串

php - 将 DateTime 转换为 Date Doctrine php

php - 如何建立从 iPhone 到 Apache 服务器的套接字连接并通过 PHP 进行通信?