Я использую следующее регулярное выражение для удаления всех невидимых символов из строки 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