У меня возникли проблемы с поиском правильной строки регулярного выражения, чтобы удалить последовательность из нескольких? символы. Я хочу заменить более одного последовательного? с одним?, но какие символы убежать ... ускользает от меня.
Пример ввода:
Is this thing on??? or what???
Желаемый результат:
Is this thing on? or what?
Я использую preg_replace () в PHP.






preg_replace('{\?+}', '?', 'Is this thing on??? or what???');
То есть вам нужно только избежать вопросительного знака, плюс в «\? +» Означает, что мы заменяем каждый экземпляр одним или несколькими символами, хотя я подозреваю, что «\? {2,}» может быть даже лучше и более эффективный (замена каждого экземпляра двумя или более знаками вопроса.
preg_replace( '{\?+}', '?', $text );
должен это сделать.
Вам нужно экранировать сам вопросительный знак с помощью обратной косой черты, а затем экранировать саму обратную косую черту с помощью другой обратной косой черты.
Это такие ситуации, когда C# дословные строки хорош.
Вам не нужно экранировать обратную косую черту в одной строке в кавычках. Вы можете, если хотите, но не обязаны.
Это должно работать (я это тестировал):
preg_replace('/\?+/', '?', $subject);
preg_replace('/\?{2,}/','?',$text)
это должно сделать это
preg_replace('/(\?+)/m', '?', 'what is going in here????');
знак вопроса должен быть экранирован, а m означает многострочный режим.
Это был хороший веб-сайт, чтобы опробовать его на http://regex.larsolavtorvik.com/
Вы пробовали шаблон
[?]+
с заменой ??
? в символьном классе считается буквальным знаком вопроса.
str_replace('??', '?', 'Replace ??? in this text');
Результатом этого будет «Заменить ?? в этом тексте», если вы не поместите его в цикл while, и если вы это сделаете, он внезапно станет намного менее эффективным, чем preg_replace. На моем тестовом сервере выполнение этого в цикле 1 миллион раз заняло (примерно) 2,7 секунды (примерно), тогда как preg_replace заняла всего 1,2 секунды.
+1 за уменьшение количества блоков вопросительных знаков на Земле.