with texto strip_tags remove limpiar from eliminar allow all php regex unicode multibyte mbstring

texto - Recorte multibyte en PHP?



string strip_tags (6)

Esta versión es compatible con el segundo parámetro opcional $ charlist:

function mb_trim ($string, $charlist = null) { if (is_null($charlist)) { return trim ($string); } else { $charlist = str_replace (''/'', ''//'', preg_quote ($charlist)); return preg_replace ("/(^[$charlist]+)|([$charlist]+$)/us", '''', $string); } }

Sin embargo, no admite "..." para rangos.

Aparentemente no hay mb_trim en la familia mb_* , entonces estoy tratando de implementar uno para mí.

Recientemente encontré esta expresión regular en un comentario en php.net :

/(^/s+)|(/s+$)/u

Entonces, lo implementaría de la siguiente manera:

function multibyte_trim($str) { if (!function_exists("mb_trim") || !extension_loaded("mbstring")) { return preg_replace("/(^/s+)|(/s+$)/u", "", $str); } else { return mb_trim($str); } }

La expresión regular me parece correcta, pero soy extremadamente novato con expresiones regulares. ¿Esto eliminará efectivamente cualquier espacio Unicode en el comienzo / final de una cadena?


La función de trim estándar recorta un puñado de espacio y caracteres similares a espacios. Estos se definen como caracteres ASCII, lo que significa ciertos bytes específicos de 0 a 0100 0000 .

La entrada correcta de UTF-8 nunca contendrá caracteres de varios bytes que están compuestos de bytes 0xxx xxxx . Todos los bytes en caracteres UTF-8 multibyte propios comienzan con 1xxx xxxx .

Esto significa que en una secuencia UTF-8 adecuada , los bytes 0xxx xxxx solo pueden referirse a caracteres de un solo byte. La función de trim de PHP, por lo tanto, nunca recortará "medio carácter" suponiendo que tiene una secuencia UTF-8 adecuada . (Tenga mucho cuidado con las secuencias impropias de UTF-8 ).

Los /s en expresiones regulares ASCII coincidirán principalmente con los mismos caracteres que trim .

Las funciones de preg con el modificador /u solo funcionan en expresiones regulares codificadas en UTF-8 , y //s/u también concuerdan con nbsp de UTF8. Este comportamiento con espacios sin interrupciones es la única ventaja de usarlo.

Si desea reemplazar caracteres espaciales en otras codificaciones que no sean compatibles con ASCII, ninguno de los dos métodos funcionará.

En otras palabras, si está tratando de recortar los espacios habituales de una cadena compatible con ASCII, simplemente use trim . Cuando use //s/u tenga cuidado con el significado de nbsp para su texto.

Cuídate:

$s1 = html_entity_decode(" Hello   "); // the NBSP $s2 = " 𩸽 exotic test ホ 𩸽 "; echo "/nCORRECT trim: [". trim($s1) ."], [". trim($s2) ."]"; echo "/nSAME: [". trim($s1) ."] == [". preg_replace(''/^/s+|/s+$/'','''',$s1) ."]"; echo "/nBUT: [". trim($s1) ."] != [". preg_replace(''/^/s+|/s+$/u'','''',$s1) ."]"; echo "/n!INCORRECT trim: [". trim($s2,''𩸽 '') ."]"; // DANGER! not UTF8 safe! echo "/nSAFE ONLY WITH preg: [". preg_replace(''/^[𩸽/s]+|[𩸽/s]+$/u'', '''', $s2) ."]";


No sé lo que estás tratando de hacer con la interminable función recursiva que estás definiendo, pero si solo quieres un ajuste multibyte-safe, esto funcionará.

function mb_trim($str) { return preg_replace("/(^/s+)|(/s+$)/us", "", $str); }


Ok, entonces tomé la solución @ edson-medina y corrigí un error y agregué algunas pruebas unitarias. Aquí están las 3 funciones que usamos para dar a las contrapartes mb trim, rtrim y ltrim.

//////////////////////////////////////////////////////////////////////////////////// //Add some multibyte core functions not in PHP //////////////////////////////////////////////////////////////////////////////////// function mb_trim($string, $charlist = null) { if (is_null($charlist)) { return trim($string); } else { $charlist = preg_quote($charlist, ''/''); return preg_replace("/(^[$charlist]+)|([$charlist]+$)/us", '''', $string); } } function mb_rtrim($string, $charlist = null) { if (is_null($charlist)) { return rtrim($string); } else { $charlist = preg_quote($charlist, ''/''); return preg_replace("/([$charlist]+$)/us", '''', $string); } } function mb_ltrim($string, $charlist = null) { if (is_null($charlist)) { return ltrim($string); } else { $charlist = preg_quote($charlist, ''/''); return preg_replace("/(^[$charlist]+)/us", '''', $string); } } ////////////////////////////////////////////////////////////////////////////////////

Aquí están las pruebas unitarias que escribí para cualquier persona interesada:

public function test_trim() { $this->assertEquals(trim('' foo ''), mb_trim('' foo '')); $this->assertEquals(trim('' foo '', '' o''), mb_trim('' foo '', '' o'')); $this->assertEquals(''foo'', mb_trim('' Åfooホ '', '' Åホ'')); } public function test_rtrim() { $this->assertEquals(rtrim('' foo ''), mb_rtrim('' foo '')); $this->assertEquals(rtrim('' foo '', '' o''), mb_rtrim('' foo '', '' o'')); $this->assertEquals(''foo'', mb_rtrim(''fooホ '', '' ホ'')); } public function test_ltrim() { $this->assertEquals(ltrim('' foo ''), mb_ltrim('' foo '')); $this->assertEquals(ltrim('' foo '', '' o''), mb_ltrim('' foo '', '' o'')); $this->assertEquals(''foo'', mb_ltrim('' Åfoo'', '' Å'')); }


También puede recortar espacios no compatibles con ASCII (espacio sin interrupción, por ejemplo) en cadenas UTF-8 con preg_replace(''/^/p{Z}+|/p{Z}+$/u'','''',$str);

/s solo coincidirá con el carácter espacial "compatible con ascii" incluso con el modificador u .
pero /p{Z} coincidirá con todos los caracteres de espacio Unicode conocidos


mb_ereg_replace parece dar la vuelta a eso:

function mb_trim($str,$regex = "(^/s+)|(/s+$)/us") { return mb_ereg_replace($regex, "", $str); }

... pero no sé lo suficiente sobre las expresiones regulares para saber cómo agregarías el parámetro "charlist" que la gente esperaría poder alimentar a trim (), es decir, una lista de caracteres para recortar, así que has just hizo que la expresión regular sea un parámetro.

Podría ser que pudieras tener una serie de caracteres especiales, luego recorrerlos para cada personaje de la lista de charlas y escapar de ellos cuando construyas la cadena de expresiones regulares.