课程咨询 :025-86971863

南京PHP培训 > 达内新闻 > php shtmlspecialchars 函数 详解
  • php shtmlspecialchars 函数 详解

    发布:南京PHP培训      来源:达内新闻    

  • 南京PHP培训学习php shtmlspecialchars 函数:

    [php]

    function shtmlspecialchars($string) {

    if(is_array($string)) {

    foreach($string as $key => $val) {

    $string[$key] = shtmlspecialchars($val);

    }

    } else {

    $string = preg_replace('/&((#(\d{3,5}|x[a-fA-F0-9]{4})|[a-zA-Z][a-z0-9]{2,5});)/', '&\\1',

    str_replace(array('&', '"', '<', '>'), array('&amp;', '&quot;', '&lt;', '&gt;'), $string));

    }

    return $string;

    }

    以上就是shtmlspecialchars()函数的定义,其他的不讲,就讲这句让很多人揪心的

    [php]

    $string = preg_replace('/&((#(\d{3,5}|x[a-fA-F0-9]{4})|[a-zA-Z][a-z0-9]{2,5});)/', '&\\1',

    str_replace(array('&', '"', '<', '>'), array('&', '"', '<', '>'), $string));

    这里先介绍下这个函数的作用:

    html中可能出现的四种特殊字符进行转义,分别是

    &转&amp;

    "转&quot;

    <转&lt;

    >转&lt;(ps:这个后面的分号";"是连在一起的,一个整体,不是作者为了分隔用的)

    这与PHP自带的htmlspecialchars()效果刚好相反。

    那么一般人里面会用下面的代码实现这个函数所要实现的功能

    [php]

    str_replace(array('&', '"', '<', '>'), array('&', '"', '<', '>'), $string));

    但是等一等!

    问:等什么?不是已经完成了这个功能了?

    答:错,大错,特错了,你这叫宁可枉杀3000,不放过一个,不人道的呀。

    问:哪里错了?

    答:情况下面的内容!

    如果仅仅用上面的函数,那么会将html特殊字符和unicode编码都破坏掉这可不是我们要的结果,具体字符表见文章后面的附件。

    有人观察了字符表的所有数据,最后得出下面的结论:

    1、html特殊字符都是由&#开头后面加3-5个数字或者&#开头加一个字符和2-5个字符或数字组成的字符串

    2、unicode编码是以&#开头后面加4个16进制数字组成的字符串。

    根据第一条,我们应该写出正则表达式:&#/d{3,5}|[a-zA-Z][a-zA-Z0-9]{2,5};(ps:这个也是自带分号";"的)

    根据第二条,可以得出&#[a-fA-F0-9]{4}; (ps:因为16进制是从0-f)

    又由于前面的操作已经把&替换成了&amp;所以讲上面两条整合下就出了下面的

    /&amp;((#(\d{3,5}|x[a-fA-F0-9]{4})|[a-zA-Z][a-z0-9]{2,5});)/

    问题1:

    有人问,是不是可以写成下面的样子

    /&amp;#(((\d{3,5}|x[a-fA-F0-9]{4})|[a-zA-Z][a-z0-9]{2,5});)/

    把井号提出来,当然可以,不过如果你要这样写,后面的再提,有些下改动。

    我们把第一步操作

    [php]

    str_replace(array('&', '"', '<', '>'), array('&', '"', '<', '>'), $string));

    结果写成$string

    那么反替换我们就可以简略的写成

    preg_replace('/&amp;((#(\d{3,5}|x[a-fA-F0-9]{4})|[a-zA-Z][a-z0-9]{2,5});)/', '&\\1',$string)

    这里,前面的正则表达式已经很清楚了,但是作者又后面的&\\1搞晕了,什么意思呀?

    经查证\1代表正则表达式的第一个括号内的内容。

    自己写了一个测试

    [php]

    <?php

    $string = 'x10p';

    $string1 = preg_replace('/(x)([0-9]+)p/', '&\\1',$string);

    $string2 = preg_replace('/x([0-9]+)p/', '&\\1',$string);

    echo $string1;

    echo '<br />';

    echo $string2;

    ?>

    输出的结果分别是

    &x        第一括号内的是 x

    &10     第一括号内的是10

    [php]

    preg_replace('/&((#(\d{3,5}|x[a-fA-F0-9]{4})|[a-zA-Z][a-z0-9]{2,5});)/', '&\\1',$string)

    结果就是仅仅把$amp;替换为&而后面的保留不变。

    到这可以解决上面的问题1,是否可以把#拿出来,如果你吧#拿出来的话,那么就是说会将&amp;#都用&替换,然后后面的你得写'&#\\1',这样就可以,不过是不是感觉

    多此一举了?是的!

    附录:

    html 字符表

    特殊符号 命名实体 十进制编码 特殊符号 命名实体 十进制编码 特殊符号 命名实体 十进制编码

    Α  &Alpha;  &#913;  Β  &Beta;  &#914;  Γ  &Gamma;  &#915;

    Δ  &Delta;  &#916;  Ε  &Epsilon;  &#917;  Ζ  &Zeta;  &#918;

    Η  &Eta;  &#919;  Θ  &Theta;  &#920;  Ι  &Iota;  &#921;

    Κ  &Kappa;  &#922;  Λ  &Lambda;  &#923;  Μ  &Mu;  &#924;

    Ν  &Nu;  &#925;  Ξ  &Xi;  &#926;  Ο  &Omicron;  &#927;

    Π  &Pi;  &#928;  Ρ  &Rho;  &#929;  Σ  &Sigma;  &#931;

    Τ  &Tau;  &#932;  Υ  &Upsilon;  &#933;  Φ  &Phi;  &#934;

    Χ  &Chi;  &#935;  Ψ  &Psi;  &#936;  Ω  &Omega;  &#937;

    α  &alpha;  &#945;  β  &beta;  &#946;  γ  &gamma;  &#947;

    δ  &delta;  &#948;  ε  &epsilon;  &#949;  ζ  &zeta;  &#950;

    η  &eta;  &#951;  θ  &theta;  &#952;  ι  &iota;  &#953;

    κ  &kappa;  &#954;  λ  &lambda;  &#955;  μ  &mu;  &#956;

    ν  &nu;  &#957;  ξ  &xi;  &#958;  ο  &omicron;  &#959;

    π  &pi;  &#960;  ρ  &rho;  &#961;  ς  &sigmaf;  &#962;

    σ  &sigma;  &#963;  τ  &tau;  &#964;  υ  &upsilon;  &#965;

    φ  &phi;  &#966;  χ  &chi;  &#967;  ψ  &psi;  &#968;

    ω  &omega;  &#969;  ϑ  &thetasym;  &#977;  ϒ  &upsih;  &#978;

    ϖ  &piv;  &#982;  •  &bull;  &#8226;  …  &hellip;  &#8230;

    ′  &prime;  &#8242;  ″  &Prime;  &#8243;  ‾  &oline;  &#8254;

    ⁄  &frasl;  &#8260;  ℘  &weierp;  &#8472;  ℑ  &image;  &#8465;

    ℜ  &real;  &#8476;  ™  &trade;  &#8482;  ℵ  &alefsym;  &#8501;

    ←  &larr;  &#8592;  ↑  &uarr;  &#8593;  →  &rarr;  &#8594;

    ↓  &darr;  &#8595;  ↔  &harr;  &#8596;  ↵  &crarr;  &#8629;

    ⇐  &lArr;  &#8656;  ⇑  &uArr;  &#8657;  ⇒  &rArr;  &#8658;

    ⇓  &dArr;  &#8659;  ⇔  &hArr;  &#8660;  ∀  &forall;  &#8704;

    ∂  &part;  &#8706;  ∃  &exist;  &#8707;  ∅  &empty;  &#8709;

    ∇  &nabla;  &#8711;  ∈  &isin;  &#8712;  ∉  &notin;  &#8713;

    ∋  &ni;  &#8715;  ∏  &prod;  &#8719;  ∑  &sum;  &#8722;

    −  &minus;  &#8722;  ∗  &lowast;  &#8727;  √  &radic;  &#8730;

    ∝  &prop;  &#8733;  ∞  &infin;  &#8734;  ∠  &ang;  &#8736;

    ∧  &and;  &#8869;  ∨  &or;  &#8870;  ∩  &cap;  &#8745;

    ∪  &cup;  &#8746;  ∫  &int;  &#8747;  ∴  &there4;  &#8756;

    ∼  &sim;  &#8764;  ≅  &cong;  &#8773;  ≈  &asymp;  &#8773;

    ≠  &ne;  &#8800;  ≡  &equiv;  &#8801;  ≤  &le;  &#8804;

    ≥  &ge;  &#8805;  ⊂  &sub;  &#8834;  ⊃  &sup;  &#8835;

    ⊄  &nsub;  &#8836;  ⊆  &sube;  &#8838;  ⊇  &supe;  &#8839;

    ⊕  &oplus;  &#8853;  ⊗  &otimes;  &#8855;  ⊥  &perp;  &#8869;

    ⋅  &sdot;  &#8901;  ⌈  &lceil;  &#8968;  ⌉  &rceil;  &#8969;

    ⌊  &lfloor;  &#8970;  ⌋  &rfloor;  &#8971;  ◊  &loz;  &#9674;

    ♠  &spades;  &#9824;  ♣  &clubs;  &#9827;  ♥  &hearts;  &#9829;

    ♦  &diams;  &#9830;     &nbsp;  &#160;  ¡  &iexcl;  &#161;

    ¢  &cent;  &#162;  £  &pound;  &#163;  ¤  &curren;  &#164;

    ¥  &yen;  &#165;  ¦  &brvbar;  &#166;  §  &sect;  &#167;

    ¨  &uml;  &#168;  ©  &copy;  &#169;  ª  &ordf;  &#170;

    «  &laquo;  &#171;  ¬  &not;  &#172;     &shy;  &#173;

    ®  &reg;  &#174;  ¯  &macr;  &#175;  °  &deg;  &#176;

    ±  &plusmn;  &#177;  ²  &sup2;  &#178;  ³  &sup3;  &#179;

    ´  &acute;  &#180;  µ  &micro;  &#181  "  &quot;  &#34;

    <  &lt;  &#60;  >  &gt;  &#62;  '     &#39;

    推荐文章

上一篇:PHP缓存使用的一个陷阱

下一篇:php ob_start()、ob_end_flush和ob_end_clean()多级缓冲

最新开班日期  |  更多

PHP高级开发工程师就业班

PHP高级开发工程师就业班

开班日期:04-28

PHP高级开发工程师精品班

PHP高级开发工程师精品班

开班日期:04-28

PHP高级开发工程师周末班

PHP高级开发工程师周末班

开班日期:04-28

PHP高级开发工程师定制班

PHP高级开发工程师定制班

开班日期:04-28

  • 地址:南京市秦淮区太平南路333号金陵御景园8楼达内
  • 课程培训电话:025-86971863     全国服务监督电话:400-111-8989
  • 服务邮箱 tousu@tedu.cn
  • 2001-2016 达内时代科技集团有限公司 版权所有 京ICP证8000853号-56