程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> php shtmlspecialchars 函數 詳解

php shtmlspecialchars 函數 詳解

編輯:關於PHP編程

由於還是碼農新人,所以還未開始正式的編寫大的工程代碼,所以老員工給了我一個去年寫的大的PHP工程的工程代碼,先看下。抱著必須掃清每個死角的心裡,下午碰到了

shtmlspecialchars()函數,網上一查挺多人都在用的,但不是PHP自帶的,而是莫比較官方的寫的。但是這裡面的正則表達式著實讓我糾結了一方,不講廢話了,切入正題。

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


作者:wolinxuebin

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved