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


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

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

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

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

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

Author: Stefan, 2012-09-22

3 answers

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

$string = preg_replace('/[^\P{C}\n]+/u', '', $string);

Объяснение:

  • \P{C} - это то же самое, что и [^\p{C}].
  • Следовательно, [^\P{C}] - это то же самое, что \p{C}.
  • Поскольку теперь у нас есть отрицаемый класс символов, мы можем вычесть из него другие символы, такие как \n.
 5
Author: Tim Pietzcker, 2012-09-22 16:12:51

Мое использование отрицательного утверждения вы можете использовать класс символов, кроме того, что соответствует утверждению, поэтому:

$res = preg_replace('/(?!\n)\p{C}/', '', $input);

(Диалект регулярных выражений PHP не поддерживает вычитание классов символов, что в противном случае было бы другим подходом: [\p{C}-[\n]].)

 2
Author: Richard, 2012-09-22 15:12:02

Прежде чем вы это сделаете, замените новые строки (я полагаю, вы используете что-то вроде \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

 0
Author: weltschmerz, 2012-09-22 11:55:23