用php清理句子
这个标题听起来可能很奇怪,但我有点想建立一个preg_替代品,为一个文本区域处理凌乱的作者。它必须:用php清理句子,php,regex,string,preg-replace,sanitization,Php,Regex,String,Preg Replace,Sanitization,这个标题听起来可能很奇怪,但我有点想建立一个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);