2012-09-22 38 views
7

estoy usando la siguiente expresión regular para eliminar todos los caracteres invisibles desde una cadena UTF-8:UTF-8 Cadena eliminar todos los caracteres invisibles excepto una línea nueva

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

Esto funciona bien, pero ¿cómo puedo alterar de modo que elimina todos los caracteres invisibles EXCEPTO nuevas líneas? Probé algunas cosas usando [^ \ n] etc. pero no funciona.

Gracias por ayudar!

edición: carácter de nueva línea es '\ n'

Respuesta

5

Utilice una "doble negación":

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

Explicación:

  • \P{C} es el mismo que [^\p{C}]. Por favor, [^\P{C}] es lo mismo que \p{C}.
  • Como ahora tenemos una clase de caracteres negados, podemos restar otros caracteres como \n.
+0

¡Gracias! Esto parece estar funcionando perfecto :) – Stefan

0

Antes de hacerlo, vuelva a colocar los saltos de línea (supongo que está utilizando algo así como \n) con una cadena aleatoria como ++++++++ (cualquier cadena que no va a ser eliminado por su expresión regular y no ocurre naturalmente en su cadena en primer lugar), luego ejecute su preg_replace, luego reemplace ++++++++ con \n nuevamente.

$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 

Eso debería hacer. Si está utilizando <br/> en lugar de \n simplemente utilizar nl2br para conservar los saltos de línea y reemplazar <br/> en lugar de \n

+0

\ n es. Lo que describiste es lo que estoy usando en este momento, pero realmente no creo que sea tan bueno como podría hacerlo la expresión regular (creo, pero no sé cómo) – Stefan

2

Mi usando una afirmación negativa que pueda una clase de caracteres, excepto lo que coincide con la afirmación, por lo que:

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

(El dialecto PHP de expresiones regulares no admite la substracción de clases de caracteres que, de lo contrario, sería otro enfoque: [\p{C}-[\n]].)

+0

Lo intenté, no elimina las líneas nuevas, tampoco elimina otros caracteres invisibles (ambos enfoques) – Stefan

+0

@Stefan Está destinado a no eliminar las nuevas líneas: vea el título de Q "* excepto * nueva línea". – Richard

+0

Oh, lo siento, quise decir es que elimina las nuevas líneas. – Stefan

Cuestiones relacionadas