Я использую следующее регулярное выражение для удаления всех невидимых символов из строки UTF-8:
$string = preg_replace('/\p{C}+/u', '', $string);
Это прекрасно работает, но как мне его изменить, чтобы удалить все невидимые символы EXCEPT новых строк? Я пробовал некоторые вещи, используя [^ \ n] и т. Д., Но это не работает.
Спасибо за помощь!
Изменить: символ новой строки – \ n \
Используйте «двойное отрицание»:
$string = preg_replace('/[^\P{C}\n]+/u', '', $string);
Объяснение:
\P{C} совпадает с [^\p{C}] . [^\P{C}] совпадает с \p{C} . \n . При использовании отрицательного утверждения вы можете использовать класс символов, кроме того, что соответствует утверждению, так что:
$res = preg_replace('/(?!\n)\p{C}/', '', $input);
(Диалект регулярных выражений PHP не поддерживает вычитание символьного класса, который в противном случае был бы другим: [\p{C}-[\n]] .)
Прежде чем вы это сделаете, замените новые строки (я полагаю, вы используете что-то вроде \n ) со случайной строкой, например ++++++++ (любая строка, которая не будет удалена вашим регулярным выражением и, естественно, не возникает в вашем строка в первую очередь), затем запустите preg_replace, а затем замените ++++++++ \n раз.
$string=str_replace('\n','++++++++',$string); //Replace \n $string=preg_replace('/\p{C}+/u', '', $string); //Use your regexp $string=str_replace('++++++++','\n',$string); //Insert \n again
Это нужно делать. Если вы используете <br/> вместо \n просто используйте nl2br для сохранения разрывов строк и замените <br/> вместо \n