Строка UTF 8 удаляет все невидимые символы, кроме новой строки
Я использую следующее регулярное выражение для удаления всех невидимых символов из строки UTF-8:
$string = preg_replace('/\p{C}+/u', '', $string);
Это работает нормально, но как мне изменить его так, чтобы он удалял все невидимые символы, КРОМЕ новых строк? Я пробовал кое-что, используя [^\n] и т.д., Но это не работает.
Спасибо за помощь!
Изменить: символ новой строки - "\n"
3 answers
Используйте "двойное отрицание":
$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