Я попытался найти ответ на это некоторое время, но не смог найти его. Было много сообщений, связанных с совпадающим текстом, который не предшествует определенному тексту, но ни один из них не работает для этого случая, когда + сопоставляется, но разрешено только в том случае, если он предшествует одному + (например. ++)PHP PCRE соответствует пунктуации, но не ++
Я пытаясь удалить знаки препинания из текста, но пусть два последовательных знаков ++, чтобы остаться, но единичные знаки + исчезнуть
$text="Hello World! C+ C++ C#";
print_r(preg_replace('/(?!\+\+)[[:punct:]]/', ' ', $text));
Результаты в (я не знаю, почему последний + удаляется кто-нибудь может объяснить?):
Hello World C C + C
Если я пытаюсь:
$text="Hello World! C+ C++ C#";
print_r(preg_replace('/(?!\+)[[:punct:]]/', ' ', $text));
Результат:
Hello World C + C++ C
Но результат я хочу:
Здравствуйте World C C++ C
Благодаря
UPDATE: Я понял, что, вероятно, следует отметить, что у меня будут другие символы, которые я хочу, чтобы избежать. Возможно, я упростил этот вопрос. Например я могу хотеть, чтобы избежать # и, таким образом, результат был бы
Hello World C C++ C#
решение должно быть легко расширяемой. Я сожалею о неудобствах, вызванных этой недостающей информацией.
Проблема возникает из сценария типа «++++». Что ты собираешься делать? – sln
Затем просто перечислите специальные случаи внутри группы, не содержащей захвата, перед '(* SKIP) (* F)' - 'preg_replace ('/ (?: [# ^] | \ * {3} | \ + {2}) (* SKIP) (* F) | [[: punct:]] +/',' ', $ text); ' –
' preg_replace (' \ b (\ + (?! \ +) | [^ \ P { P} #]) ',' ', $ text) 'вам нужно добавить специальные символы внутри класса символов. Например. для исключения '!': '[^ \ P {P} #!]' – revo