Как заменить повторяющиеся знаки препинания в PHP с помощью регулярных выражений?

Скажем, у меня есть это

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

Как я могу этого добиться? Я пробовал preg_replace_callback, но безрезультатно. Я использовал Поиск кратчайшего повторяющегося шаблона в строке в качестве отправная точка, но она работает с полным предложением, мне нужно, чтобы она работала пословно + мне нужно удалить только повторяющиеся вычисления (шаблоны)? Активный код


person Hammad Khan    schedule 09.03.2017    source источник
comment
Почему желаемый результат не Hello ? ГДЕ ВЫ! Комон?!?   -  person erisco    schedule 09.03.2017
comment
@erisco нужно очистить текст, который имеет ?!?!?!?!?!?!?!?!?!?!?!?!?!, !!!!!!!!!!!!!!!!, ???!!!???!!! и т.д   -  person Hammad Khan    schedule 09.03.2017


Ответы (2)


Используйте приведенный ниже код:

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

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

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

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

Вставьте любой знак препинания в массив замены, чтобы удалить повторяющиеся знаки препинания.

person MahdiY    schedule 09.03.2017
comment
можно ли это улучшить, чтобы использовать кучу знаков препинания [.!?] и автоматически находить повторяющийся шаблон? - person Hammad Khan; 09.03.2017
comment
Код обновлен. Чтобы удалить любой повторяющийся знак, добавьте его в массив замены. - person MahdiY; 09.03.2017
comment
кстати, вы можете придумать способ найти повторяющийся шаблон сам по себе, как задано в этом вопрос и применить его в PHP? Я пытался, но потерпел неудачу. - person Hammad Khan; 09.03.2017

Замените \?+ на ?, !+ на !, (\?!)+ на ?! и так далее.

function dedup_punctuation($str) {
  $targets      = array('/\?+/', '/!+/', '/(\?!)+/');
  $replacements = array('?'    , '!'   , '?!'      );
  return preg_replace($targets, $replacements, $str);
}
person erisco    schedule 09.03.2017
comment
Это работает, но есть ли способ автоматически найти повторяющийся шаблон с использованием обратной ссылки и т. Д.? Для этого я должен ввести каждый вариант использования отдельно. - person Hammad Khan; 09.03.2017