1

我当前的 php 语句清理功能:

function sanitize_sentence($string) {
    $pats = array(
    '/([.!?]\s{2}),/',      # Abc.  ,Def
    '/\.+(,)/',             # ......,
    '/(!)!+/',              # abc!!!!!!!!
    '/\s+(,)/',             # abc   , def
    '/([a-zA-Z])\1\1/');    # greeeeeeen
    $fixed = preg_replace($pats,'$1',$string);
    $fixed = preg_replace('/,(?!\s)/',', ',$fixed);
    return $fixed;
}

echo sanitize_sentence('hello!!!!!!there should be a space after the exclamation mark.right???????yes.right,');

结果应该是:

你好!感叹号后面应该有一个空格。对?是的。对。

所以,仍然缺少的是:

  1. 任何 !?,.如果右侧有更多文本,则应在任何 !? 之后插入一个额外的空格。
  2. 如果最后一个字符是逗号(或与 a-zA-Z0-9 不同的任何其他字符!?。),则应将其替换为点。
  3. 如果用户写了多个问号,则应将其转换为一个(?????? = ?)。这对我来说很适合感叹号,但不知何故它不适用于其他人。

任何帮助将不胜感激!

4

2 回答 2

2

您的要求:

  1. !?,.如果右侧有更多文本,则应在 any 之后插入一个额外的空格。

    我们可以使用另一个正则表达式来做这个替换:

    $fixed = preg_replace( '/([!?,.])(\S)/', '$1 $2', $fixed); # spaces after punctuation, if it doesn't exist already
    
  2. 如果最后一个字符是逗号(或任何其他不同于 的字符a-zA-Z0-9!?.),则应将其替换为点。

    您可以使用正则表达式来获取它,该正则表达式锚定在文本的末尾:

    $fixed = preg_replace( '/[^a-zA-Z0-9!?.]+$/', '.', $fixed); # end of string must end in period
    
  3. 如果用户写了多个问号,则应将其转换为一个(?????? = ?)。这对我来说很适合感叹号,但不知何故它不适用于其他人。

    它不起作用,因为它是正?则表达式中的特殊字符,您需要对其进行转义。将相应的条目替换为:

    '/(!|\?)\1+/',              # abc!!!!!!!!, abc?????????
    

现在,输出是

hello! there should be a space after the exclamation mark. right? yes. right.
于 2012-11-16T22:33:25.997 回答
0

将此添加到您$pats的问号替换。剩下的我还没做完。

'/(\?)\?+/',              # abc?????????
于 2012-11-16T22:21:04.213 回答