regular online one characters php unicode utf-8 whitespace character-properties

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);



preg_replace(''/^[/pZ/pC]+|[/pZ/pC]+$/u'','''',$str);