Intereting Posts
Как получить тот же самый $ _SERVER как на локальном, так и на живом сервере ZF2 Форма Гидратация с несколькими объектами и полями Charset = utf8 не работает на моей странице PHP Почему идентичный PHP-скрипт может работать в одном поддомене, а не в другом? Как использовать маршрутизацию laravel для неизвестного количества параметров в URL? Вызвать функцию или метод из своего класса Можно ли указать интерфейс исходящей сети для использования в PHP SoapClient? Symfony: Можно ли установить TEMplate для компонентов? php – ftp_get – Предупреждение: ftp_get (): открытие соединения данных в режиме BINARY цикл через дни недели, начиная с сегодняшнего дня Многомерный массив от сопоставления столбцов mysql SoapServer отправляет ответ без конверта Использование Усы в качестве шаблона в Symfony 2 Как сделать текстовый DIFF с помощью PHP? Как отображать php-код и html-теги в виде текста на веб-странице

UTF 8 String удаляет все невидимые символы, кроме строки новой строки

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