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

Я использую следующее регулярное выражение для удаления всех невидимых символов из строки UTF-8:

$string = preg_replace('/\p{C}+/u', '', $string);

Это прекрасно работает, но как мне изменить его, чтобы он удалял все невидимые символы, КРОМЕ новых строк? Я пробовал некоторые вещи, используя [^\n] и т. Д., Но это не работает.

Спасибо за помощь!

Изменить: символ новой строки '\n'

3 ответа

Решение

Используйте "двойное отрицание":

$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

Другие вопросы по тегам