php - online - regular expression
Recortar espacios en blanco Unicode en PHP 5.2 (6)
Esta página puede ayudar:
http://nadeausoftware.com/articles/2007/9/php_tip_how_strip_punctuation_characters_web_page
¿Cómo puedo recortar una string(6) " page"
, donde el primer espacio en blanco es un espacio sin interrupción 0xc2a0?
Probé trim()
y preg_match(''/^/s*(.*)/s*$/u'', $key, $m);
.
Otra pregunta: ¿cómo puedo copiar de manera confiable estos personajes? Parecen convertirse en espacios "normales", lo que dificulta la depuración.
La solución existente solo menciona caracteres /pZ
. Sin embargo, hay seis caracteres de espacio en blanco Unicode que quedan fuera del alcance de esa propiedad:
% unichars ''/p{WhiteSpace}'' ''/PZ''
-- 9 0009 CHARACTER TABULATION
-- 10 000A LINE FEED (LF)
-- 11 000B LINE TABULATION
-- 12 000C FORM FEED (FF)
-- 13 000D CARRIAGE RETURN (CR)
-- 133 0085 NEXT LINE (NEL)
Esos seis son todos de tipo /pC
y, en particular, tipo /p{Cc}
. Sin embargo, hay cincuenta y nueve caracteres que no son espacios en blanco que también son /p{Cc}
:
% unichars ''/P{WhiteSpace}'' ''/p{Cc}'' | wc -l
59
La versión simple de mi propia prueba para saber si algo es un personaje imprimible o no es simplemente [/pZ/pC]
; eso es lo que usa unichars
, por ejemplo.
Una prueba más cuidadosa consideraría si algo debería ocupar 0, 1 o 2 posiciones de impresión. Eso requiere considerar si se trata de una combinación de Mark, que es property /pM
, y también si tiene las propiedades de ancho medio o ancho completo. Por ejemplo:
% uniprops ff5e ffeb
U+FF5E ‹~› /N{ FULLWIDTH TILDE }:
/pS /p{Sm}
All Any Assigned InHalfwidthAndFullwidthForms Changes_When_NFKC_Casefolded
CWKCF Common Zyyy Sm S Gr_Base Grapheme_Base Graph GrBase Math
Math_Symbol Print Symbol
U+FFEB ‹→› /N{ HALFWIDTH RIGHTWARDS ARROW }:
/pS /p{Sm}
All Any Assigned InHalfwidthAndFullwidthForms Changes_When_NFKC_Casefolded
CWKCF Common Zyyy Sm S Gr_Base Grapheme_Base Graph GrBase Math
Math_Symbol Print Symbol
Para ellos, necesitaría usar la propiedad no binaria East Asian Width. Estos son aplicables:
% uniprops -l | grep -i width
Block:Halfwidth_And_Fullwidth_Forms
InHalfwidthAndFullwidthForms
East_Asian_Width:A
East_Asian_Width=Ambiguous
East_Asian_Width:Ambiguous
East_Asian_Width:F
East_Asian_Width=Fullwidth
East_Asian_Width:Fullwidth
East_Asian_Width:H
East_Asian_Width=Halfwidth
East_Asian_Width:Halfwidth
East_Asian_Width=Neutral
East_Asian_Width:Na
East_Asian_Width=Narrow
East_Asian_Width:Narrow
East_Asian_Width:Neutral
East_Asian_Width:W
East_Asian_Width=Wide
East_Asian_Width:Wide
Esos tienen abreviaturas como /p{Ea=F}
y /p{Ea=H}
. Hay muchos de estos:
% uninames ''(FULL|HALF)WIDTH'' | wc -l
454
Por supuesto, no debe seguir nombres para estas cosas, sino en propiedades:
% unichars ''[/p{Ea=F}/p{Ea=H}]'' | wc -l
227
% unichars ''[/p{Ea=F}/p{Ea=H}/p{Ea=Na}]'' | wc -l
338
% unichars ''[/p{Ea=F}/p{Ea=H}/p{Ea=Na}/pM]'' | wc -l
1488
Para mostrarle cuántas, muchas propiedades tienen estas cosas, aquí está el volcado de propiedad completo de tres caracteres diferentes, ejecutados contra Unicode 5.2:
% uniprops -ga NEL "COMBINING TILDE" ff5e
U+0085 ‹U+0085› /N{ NEXT LINE (NEL) }:
/s /v /R /pC /p{Cc}
All Any Assigned InLatin1 C Other Cc Cntrl Common Zyyy Control Pat_WS Pattern_White_Space PatWS Space SpacePerl VertSpace
White_Space WSpace
Age:1.1 Bidi_Class:B Bidi_Class=Paragraph_Separator Bidi_Class:Paragraph_Separator Bc=B Block:Latin_1
Block=Latin_1_Supplement Block:Latin_1_Supplement Blk=Latin1 General_Category=Other Canonical_Combining_Class:0
Canonical_Combining_Class=Not_Reordered Canonical_Combining_Class:Not_Reordered Ccc=NR Canonical_Combining_Class:NR
General_Category=Control Script=Common Decomposition_Type:None Dt=None East_Asian_Width=Neutral East_Asian_Width:Neutral
General_Category:C General_Category:Cc General_Category:Cntrl General_Category:Control Gc=Cc General_Category:Other Gc=C
Grapheme_Cluster_Break:CN Grapheme_Cluster_Break=Control Grapheme_Cluster_Break:Control GCB=CN Hangul_Syllable_Type:NA
Hangul_Syllable_Type=Not_Applicable Hangul_Syllable_Type:Not_Applicable Hst=NA Joining_Group:No_Joining_Group
Jg=NoJoiningGroup Joining_Type:Non_Joining Jt=U Joining_Type:U Joining_Type=Non_Joining Line_Break:Next_Line Lb=NL
Line_Break:NL Line_Break=Next_Line Numeric_Type:None Nt=None Numeric_Value:NaN Nv=NaN Present_In:1.1 Age=1.1 In=1.1
Present_In:2.0 In=2.0 Present_In:2.1 In=2.1 Present_In:3.0 In=3.0 Present_In:3.1 In=3.1 Present_In:3.2 In=3.2
Present_In:4.0 In=4.0 Present_In:4.1 In=4.1 Present_In:5.0 In=5.0 Present_In:5.1 In=5.1 Present_In:5.2 In=5.2
Script:Common Sc=Zyyy Script:Zyyy Sentence_Break:SE Sentence_Break=Sep Sentence_Break:Sep SB=SE Word_Break:Newline WB=NL
Word_Break:NL Word_Break=Newline
U+0303 ‹̃› /N{ COMBINING TILDE }:
/w /pM /p{Mn}
All Any Assigned InCombiningDiacriticalMarks Case_Ignorable CI Dia Diacritic M Mn Gr_Ext Grapheme_Extend Graph GrExt
ID_Continue IDC Inherited Zinh Mark Nonspacing_Mark Print Qaai Word XID_Continue XIDC
Age:1.1 Bidi_Class:Nonspacing_Mark Bc=NSM Bidi_Class:NSM Bidi_Class=Nonspacing_Mark Block:Combining_Diacritical_Marks
Canonical_Combining_Class:230 Canonical_Combining_Class=Above Canonical_Combining_Class:A
Canonical_Combining_Class:Above Ccc=A Decomposition_Type:None Dt=None East_Asian_Width:A East_Asian_Width=Ambiguous
East_Asian_Width:Ambiguous Ea=A General_Category:M General_Category=Mark General_Category:Mark Gc=M General_Category:Mn
General_Category=Nonspacing_Mark General_Category:Nonspacing_Mark Gc=Mn Grapheme_Cluster_Break:EX
Grapheme_Cluster_Break=Extend Grapheme_Cluster_Break:Extend GCB=EX Hangul_Syllable_Type:NA
Hangul_Syllable_Type=Not_Applicable Hangul_Syllable_Type:Not_Applicable Hst=NA Script=Inherited
Joining_Group:No_Joining_Group Jg=NoJoiningGroup Joining_Type:T Joining_Type=Transparent Joining_Type:Transparent Jt=T
Line_Break:CM Line_Break=Combining_Mark Line_Break:Combining_Mark Lb=CM NFC_Quick_Check:M NFC_Quick_Check=Maybe
NFC_Quick_Check:Maybe NFCQC=M NFKC_Quick_Check:M NFKC_Quick_Check=Maybe NFKC_Quick_Check:Maybe NFKCQC=M
Numeric_Type:None Nt=None Numeric_Value:NaN Nv=NaN Present_In:1.1 Age=1.1 In=1.1 Present_In:2.0 In=2.0 Present_In:2.1
In=2.1 Present_In:3.0 In=3.0 Present_In:3.1 In=3.1 Present_In:3.2 In=3.2 Present_In:4.0 In=4.0 Present_In:4.1 In=4.1
Present_In:5.0 In=5.0 Present_In:5.1 In=5.1 Present_In:5.2 In=5.2 Script:Inherited Sc=Zinh Script:Qaai Script:Zinh
Sentence_Break:EX Sentence_Break=Extend Sentence_Break:Extend SB=EX Word_Break:Extend WB=Extend
U+FF5E ‹~› /N{ FULLWIDTH TILDE }:
/pS /p{Sm}
All Any Assigned InHalfwidthAndFullwidthForms Changes_When_NFKC_Casefolded CWKCF Common Zyyy Sm S Gr_Base Grapheme_Base
Graph GrBase Math Math_Symbol Print Symbol
Age:1.1 Bidi_Class:ON Bidi_Class=Other_Neutral Bidi_Class:Other_Neutral Bc=ON Block:Halfwidth_And_Fullwidth_Forms
Canonical_Combining_Class:0 Canonical_Combining_Class=Not_Reordered Canonical_Combining_Class:Not_Reordered Ccc=NR
Canonical_Combining_Class:NR Script=Common Decomposition_Type:Non_Canon Decomposition_Type=Non_Canonical
Decomposition_Type:Non_Canonical Dt=NonCanon Decomposition_Type:Wide Dt=Wide East_Asian_Width:F
East_Asian_Width=Fullwidth East_Asian_Width:Fullwidth Ea=F General_Category:Math_Symbol Gc=Sm General_Category:S
General_Category=Symbol General_Category:Sm General_Category=Math_Symbol General_Category:Symbol Gc=S
Grapheme_Cluster_Break:Other GCB=XX Grapheme_Cluster_Break:XX Grapheme_Cluster_Break=Other Hangul_Syllable_Type:NA
Hangul_Syllable_Type=Not_Applicable Hangul_Syllable_Type:Not_Applicable Hst=NA Joining_Group:No_Joining_Group
Jg=NoJoiningGroup Joining_Type:Non_Joining Jt=U Joining_Type:U Joining_Type=Non_Joining Line_Break:ID
Line_Break=Ideographic Line_Break:Ideographic Lb=ID Numeric_Type:None Nt=None Numeric_Value:NaN Nv=NaN Present_In:1.1
Age=1.1 In=1.1 Present_In:2.0 In=2.0 Present_In:2.1 In=2.1 Present_In:3.0 In=3.0 Present_In:3.1 In=3.1 Present_In:3.2
In=3.2 Present_In:4.0 In=4.0 Present_In:4.1 In=4.1 Present_In:5.0 In=5.0 Present_In:5.1 In=5.1 Present_In:5.2 In=5.2
Script:Common Sc=Zyyy Script:Zyyy Sentence_Break:Other SB=XX Sentence_Break:XX Sentence_Break=Other Word_Break:Other
WB=XX Word_Break:XX Word_Break=Other
Bastante impresionante, ¿eh?
Si ha leído hasta aquí y le gustaría saber dónde obtener las tres utilidades Unicode ilustradas arriba, uniprops
, unichars
, y uninames
, por favor envíeme un correo, porque los enlaces actuales no están funcionando en este momento.
Las propiedades de propiedades PCRE Unicode se pueden usar para lograr esto
Aquí está el código con el que jugué y parece hacer lo que quiere:
<?php
function unicode_trim ($str) {
return preg_replace(''/^[/pZ/pC]+([/PZ/PC]*)[/pZ/pC]+$/u'', ''$1'', $str);
}
$key = chr(0xc2) . chr(0xa0) . ''#page#'' . chr(0xc2) . chr(0xa0);
var_dump(unicode_trim($key));
Resultado
[~]> php e.php
string(6) "#page#"
Explicación:
/ p {xx} un carácter con la propiedad xx / P {xx} un carácter sin la propiedad xx
Si xx tiene solo un carácter, entonces {} puede soltarse, por ejemplo, / p {Z} es lo mismo que / pZ
Z representa todos los separadores, C representa todos los "otros" caracteres (por ejemplo, caracteres de control)
Sin embargo, esta es mi ÚNICA solución , porque a veces hay espacios UTF8:
$stringg = preg_replace(''/^[/pZ/pC]+|[/pZ/pC]+$/u'','''',$stringg);
$stringg = preg_replace(''//s+/u'', '''', $stringg);
Tal vez algo del conjunto de funciones de cadenas multibyte? http://php.net/manual/en/function.mb-ereg.php No se puede ver mb_trim, pero hay un conjunto de funciones de expresiones regulares seguras de MB.
GRAMO
preg_replace(''/^[/pZ/pC]+|[/pZ/pC]+$/u'','''',$str);