Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用正则表达式替换PHP中重复的标点符号?_Php_Regex_Preg Replace_Repeat_Find Replace - Fatal编程技术网

如何使用正则表达式替换PHP中重复的标点符号?

如何使用正则表达式替换PHP中重复的标点符号?,php,regex,preg-replace,repeat,find-replace,Php,Regex,Preg Replace,Repeat,Find Replace,比如说,我有这个 Hello ??? WHERE ARE YOU!!!! Comon ?!?!?! desired outout Hello ? WHERE ARE YOU!!!! Comon ?! 我怎样才能做到这一点?我尝试了preg\u replace\u callback,但没有成功。我用它作为一个起点,但它适用于完整的句子,我需要它逐字处理+我只需要删除重复的计算(模式) 用?,替换\?++与一起使用,(\?!)+与,等等 function dedup_punctuation($st

比如说,我有这个

Hello ??? WHERE ARE YOU!!!! Comon ?!?!?!
desired outout
Hello ? WHERE ARE YOU!!!! Comon ?!

我怎样才能做到这一点?我尝试了
preg\u replace\u callback
,但没有成功。我用它作为一个起点,但它适用于完整的句子,我需要它逐字处理+我只需要删除重复的计算(模式)

替换
\?+
+
一起使用
(\?!)+
,等等

function dedup_punctuation($str) {
  $targets      = array('/\?+/', '/!+/', '/(\?!)+/');
  $replacements = array('?'    , '!'   , '?!'      );
  return preg_replace($targets, $replacements, $str);
}
使用以下代码:

$str = "Hello ??? WHERE ARE YOU!!!! Comon ?!?!?! ...";

$replacement = [
    '?',
    '?!',
    '.',
];

foreach( $replacement as $key => $value ){
    $pattern[$key] = sprintf("/(\%s)+/", $value);
}

echo $outout = preg_replace($pattern, $replacement, $str);

将任何标点插入替换数组以删除重复的标点。

为什么所需的输出不是“你好?你在哪里!科蒙?!”@erisco需要清理包含的文本???!!!???!!!这是可行的,但是有没有一种方法可以通过使用反向引用等自动找到重复的模式?为此,我必须分别输入每个用例。这能改进为使用大量标点符号[.!?]并自动查找重复模式吗?代码更新。若要删除任何重复符号,请将其添加到替换数组中。顺便问一下,您能否想到一种方法,按照本文的要求自行查找重复模式,并将其应用到PHP中?我试过了,但失败了。