用php清理句子

用php清理句子,php,regex,string,preg-replace,sanitization,Php,Regex,String,Preg Replace,Sanitization,这个标题听起来可能很奇怪,但我有点想建立一个preg_替代品,为一个文本区域处理凌乱的作者。它必须: 如果有感叹号,则一行中不应有另一个感叹号 如果有,逗号赢,必须是 当昏迷前有一个+空格时,它应该减少为零 这个句子不能以逗号开头或结尾 连接在一起的相同字母不得超过2个 逗号后必须始终有空格 例如: ,我的房子是绿色的,很漂亮 我的房子…是绿色的,很漂亮 我的房子是绿色的,很漂亮 最终结果应始终是: 我的房子是绿色的,很漂亮 是否有一个已经构建的正则表达式来处理这个问题 解决方案查看下面的

这个标题听起来可能很奇怪,但我有点想建立一个preg_替代品,为一个文本区域处理凌乱的作者。它必须:

  • 如果有感叹号,则一行中不应有另一个感叹号
  • 如果有,逗号赢,必须是
  • 当昏迷前有一个+空格时,它应该减少为零
  • 这个句子不能以逗号开头或结尾
  • 连接在一起的相同字母不得超过2个
  • 逗号后必须始终有空格
  • 例如:

    • ,我的房子是绿色的,很漂亮
    • 我的房子…是绿色的,很漂亮
    • 我的房子是绿色的,很漂亮
    最终结果应始终是:

    我的房子是绿色的,很漂亮

    是否有一个已经构建的正则表达式来处理这个问题


    解决方案查看下面的

    我可能不得不在我自己的网站上使用它。。。好主意

    <?php
    
    $text = 'My hooouse..., which is greeeeeen , is nice!!!  ,And pretty too...';
    
    $pats = array(
    '/([.!?]\s{2}),/', # Abc.  ,Def
    '/\.+(,)/',  # ......,
    '/(!)!+/',   # abc!!!!!!!!
    '/\s+(,)/',  # abc   , def
    '/([a-zA-Z])\1\1/', # greeeeeeen
    '/,(?!\s)/'); 
    
    $fixed = preg_replace($pats, '$1', $text);
    
    echo $fixed;
    echo "\n\n";
    
    ?>
    
    
    
    还有$text的“修改”版本:“我的房子是绿色的,很漂亮!也很漂亮。”

    更新:下面是处理“abc,def”->“abc,def”的版本

    
    
    我认为这会稍微慢一点,因为这是一个额外的函数调用

     - $result = preg_replace('/!+/', '!', $subject);
     - $result = preg_replace('/\.*,/', ',', $subject);
     - $result = preg_replace('/\s+(?=,)/', '', $subject);
     - $result = preg_replace('/^,*|,*$/', '', $subject);
     - $result = preg_replace('/([a-z])\1+/i', '$1$1', $subject);
     - $result = preg_replace('/,(?!\s)/', ', ', $subject);
    

    一个接一个地匹配你的规则:)

    我想你需要一个正则表达式,str_替换是不够的。我是说,如果一行中有两个或三个逗号呢。您甚至可能需要不止一个正则表达式来执行规则。实际上,str_replace无法完成此任务。不过,它是一个重正则表达式。解决方案是否需要允许异常,例如文本包含源代码时需要的异常?@MetaEd nope,它只是普通人的纯文本。我应该注意,上面的最后一个模式实际上不起作用。。。您必须为该项调用一个单独的preg_replace,因为替换
    “$1”
    不起作用。如果你觉得值得的话,我可以做出改变。Facebook需要这个,几乎所有其他网站都需要。很好!你说的“最后一个图案不起作用”是什么意思?你能做出改变来理解你的意思吗?@安杜夫注意到这也会删除333。它还将删除逗号而不带空格,而不是在逗号后添加空格等@andufo,它需要一些修改才能在JS中工作。这里有一个。它确实有一些我不知道的问题(使用@FakeRainBrigand示例hehe中的$string)@andufo两个正则表达式都不是100%正确的。但我认为我的正则表达式符合你的规范:)
     - $result = preg_replace('/!+/', '!', $subject);
     - $result = preg_replace('/\.*,/', ',', $subject);
     - $result = preg_replace('/\s+(?=,)/', '', $subject);
     - $result = preg_replace('/^,*|,*$/', '', $subject);
     - $result = preg_replace('/([a-z])\1+/i', '$1$1', $subject);
     - $result = preg_replace('/,(?!\s)/', ', ', $subject);