ホームページ バックエンド開発 PHPチュートリアル php shtmlspecialchars関数詳細解説_PHPチュートリアル

php shtmlspecialchars関数詳細解説_PHPチュートリアル

Jul 13, 2016 pm 05:53 PM
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('&', '"', '<', '>'), $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中可能出现的四种特殊字符进行转义,分别是

&转&

"转"

<转<

>转<(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)


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

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

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

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

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

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

自己写了一个测试

[php]

$string = 'x10p'; $string1 = preg_replace('/(x)([0-9]+)p/', '&\1',$string); $string2 = preg_replace('/x([0-9]+)p/', '&\1',$string); $string1 をエコーし​​ます。 エコー '
'; $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. # を取り出すことはできますか? # を取り出すと &# が & に置き換えられることになり、'\1' と書かなければなりません。 、それはいいけど、気分が悪い

これは不要ですか?はい!

付録:

エンティティ十进制コードという名前の特別なコード αα;  Α  Β&β;  Β  Γ &ガンマ; 
Δ Δ  Δ  Εとイプシロン。  Ε  Ζとゼータ。 
Η &η;  Η  Θ&シータ;  Θ  I&Iota; 
Κとカッパ。  Κ  Λ Λ  Λ  Μ&イン; 
Ν Ν  Ν  ΞΞ  Ξ  Ο&OM; 
ΠΠ  Π  Ρ Ρ  Ρ  ΣΣ; 
Τ &タウ;  Τ  Υ&ウプシロン;  Υ  ΦΦ 
Χ&ち;  Χ  Ψとプサイ;  Ψ  Ω&オメガ; 
αα  α  β・β  β  γ γ 
δδ  δ  εε  ε  ゼータ & ゼータ; 
η&η;  η  θθ  θ  ι ι 
κ &κ;  κ  λ とラムダ。  λ  μμ 
νν  ν  ξ ξ  ξ  ο & ミクロン; 
ππ  π  ρ&ρ;  ρ  σσ 
σσ  σ  τ τ  τ  υε; 
φφ  φ  χχ  χ  ψ ψ; 
ωω;  ω  ϑ θsym;  ϑ  ϒ ϒ 
ϖ ϖ  ϖ  •&ブル;  •  … … 
「アンドプライム」  ′  '' ″  ″  ‾ ‾ 
⁄ ⁄  ⁄  ℘ ℘  ℘  ℑ ℑ 
ℜ ℜ  ℜ  ™&トレード;  ™  ℵ ℵ 
←「ラー」  ←  ↑「」  ↑  →「」 
↓ ↓  ↓  ↔ &ハール;  ↔  ↵ ↵ 
⇐ ⇐  ⇐  ⇑ ⇑  ⇑  ⇒ ⇒ 
⇓ ⇓  ⇓  ⇔ &hああ;  ⇔  ∀ ∀ 
∂ ∂  ∂  ∃ &存在します。  ∃  ∅&空; 
∇ ∇  ∇  ∈ ∈  ∈  ∉ ∉ 
∋ ∋  ∋  ∏ ∏  ∏  ∑ ∑ 
− &マイナス;  −  ∗ &ロースト;  ∗  √ √ 
∝ ∝  ∝  ∞ ∞  ∞  ∠& 
∧ ∧  ⊥  ∨ ∨  ⊦  ∩ ∩ 
∪&カップ;  ∪  ∫ ∫  ∫  ∴ ∴ 
〜 ∼  ∼  ≅ ≅  ≅  ≈ ≈ 
≠  ≠  ≠  ≡  ≡  ≡  ≤  ≤  ≤
≥  ≥  ≥  ⊂  ⊂  ⊂  ⊃  ⊃  ⊃
⊄  ⊄  ⊄  ⊆  ⊆  ⊆  ⊇  ⊇  ⊇
⊕  ⊕  ⊕  ⊗  ⊗  ⊗  ⊥  ⊥  ⊥
⋅  ⋅  ⋅  ⌈  ⌈  ⌈  ⌉  ⌉  ⌉
⌊  ⌊  ⌊  ⌋  ⌋  ⌋  ◊  ◊  ◊
♠  ♠  ♠  ♣  ♣  ♣  ♥  ♥  ♥
♦  ♦  ♦          ¡  ¡  ¡
¢  ¢  ¢  £  £  £  ¤  ¤  ¤
¥  ¥  ¥  ¦  ¦  ¦  §  §  §
¨  ¨  ¨  ©  ©  ©  ª  ª  ª
«  «  «  ¬  ¬  ¬     ­  ­
®  ®  ®  ¯  ¯  ¯  °  °  °
±  ±  ±  ²  ²  ²  ³  ³  ³
´  ´  ´  µ  µ  µ  "  "  "
< < < >  >  >  '     '


作者:wolinxuebin

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/478078.htmlTechArticle由于还是码农新人,所以还未开始正式的编写大的工程代码,所以老员工给了我一个去年写的大的PHP工程的工程代码,先看下。抱着必须扫...
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

CakePHP の日付と時刻 CakePHP の日付と時刻 Sep 10, 2024 pm 05:27 PM

Cakephp4 で日付と時刻を操作するには、利用可能な FrozenTime クラスを利用します。

CakePHP について話し合う CakePHP について話し合う Sep 10, 2024 pm 05:28 PM

CakePHP は、PHP 用のオープンソース フレームワークです。これは、アプリケーションの開発、展開、保守をより簡単にすることを目的としています。 CakePHP は、強力かつ理解しやすい MVC のようなアーキテクチャに基づいています。モデル、ビュー、コントローラー

CakePHP ファイルのアップロード CakePHP ファイルのアップロード Sep 10, 2024 pm 05:27 PM

ファイルのアップロードを行うには、フォーム ヘルパーを使用します。ここではファイルアップロードの例を示します。

CakePHP バリデータの作成 CakePHP バリデータの作成 Sep 10, 2024 pm 05:26 PM

Validator は、コントローラーに次の 2 行を追加することで作成できます。

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

CakePHP クイックガイド CakePHP クイックガイド Sep 10, 2024 pm 05:27 PM

CakePHP はオープンソースの MVC フレームワークです。これにより、アプリケーションの開発、展開、保守がはるかに簡単になります。 CakePHP には、最も一般的なタスクの過負荷を軽減するためのライブラリが多数あります。

PHPでHTML/XMLを解析および処理するにはどうすればよいですか? PHPでHTML/XMLを解析および処理するにはどうすればよいですか? Feb 07, 2025 am 11:57 AM

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

See all articles