当(有创意的)用户试图通过一些非字母数字的重复来“吸引注意力”时,我需要清理文章标题。
例子:
- 买我的产品!!!!!!!!!!!!!!!!!!!!!!
- 购买我的产品!? !? !? !? !? !?
- 买我的产品!!!!!!!!!.......!!!!!!!
- 购买我的产品<------------
一些可接受的解决方案是将非字母数字的重复次数减少到 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/