PHP字符串——编码与转义

因为PHP程序经常与HTML页、Web地址(URL)以及数据库交互,所以PHP提供一些函数来帮助你处理这些类型的数据。HTML、Web页地址和数据库命令都是字符串,但是它们每个都要求不同的字符以不同的方法来转义。例如,在Web地址中一个空格被写成%20,而直接量小于符号(<)在HTML文档中必须写作&lt。PHP有许多内置函数来转换和取得这些编码。
HTML:在HTML中特殊的字符以实体(entity)表示,如&amp;和&lt;。这里有两个PHP函数来把字符串中的特殊字符转换为实体,一个用于删除HTML标签,一个仅用于提取meta标签。
对所有特殊字符进行实体引用:函数htmlentities()将HTML字符转换为对应的实体(除了空格符)。包括小于符号(<)、大于符号(>)、与号(&)和重音字符。(entity实体)
只对HTML语法字符进行实体引用:函数htmlspacialchars()转换最小的实体集来生成合法的HTML。下面的实体被转换:
与符号(&)被转换成&amp;
双引号(")被转换成&quot;
单引号(‘)被转换成&#039;(就像调用htmlentities()时使用ENT_QUOTES的效果)
小于号(<)被转换成&lt;
大于号(>)被转换成&gt;
如果有一个应用程序来显示用户填入表单的数据,则要在显示和保存数据之前通过htmlspecialchars()处理数据。如果没有处理的话,一旦用户提交了像"angle<30"或"sturm & drang"这样的字符串,浏览器会人为这些特殊的字符是HTML,从而得到一个混乱的页面。

删除HTML标签
函数strip_tags()从字符串中删除HTML标签:
$input=‘<p>Howdy,&quot;Cowboy&quot;</p>;
$output=strip_tags($input);//$output是‘Howdy,&quot;Cowboy&quot;‘
函数可以有第二个参数来指定在字符串中留下的标签。之列出标签的开始形式,在第二个参数中列出的标签结束形式也将被保留:
$input=‘The <b>bold</b> tags will<i>stay</i><p>‘;
$output=strip_tags($input,‘<b>‘);//$output是‘The <b>bold</b> tags will stay‘
在保留标签中的属性不会被strip_tags()改变。由于HTML标签属性(例如style和onmouseover)可以影响Web页面的外观和行为,所以用strip_tags()保留一些标签可能会导致无法删除所有潜在的冗余内容。

提取元标签
如果你把Web页面的HTML存在一个字符串中,函数get_meta_tags()可返回包含该页面中元标签(meta tag)内容的数组。元标签的名字(keywords、author、escription等)成为数组的键,而元标签的内容则成为对应的值:
$meta_tags=get_meta_tags(‘http://www.example.com/‘);
echo "Web page made by {$meta_tags[author]}";
函数一般的形式是:
$array=get_meta_tags(filename[,use_include_path]);
可以指定参数use_include_path为true,这样可使PHP尝试用标准包含路径打开文件。

URL:PHP提供了一些函数用于对URL进行编码和解码。有两种方法对URL编码,其区别在于如何处理空格。第一种(根据RFC1738规范)把空格当做URL中的另一个非法字符并把它编码为%20。第二种(执行application/x-www-form-urlencoded系统)把空格编码为一个+并且把它用于建立查询的字符串中。
注意并不需要对一个完整的URL使用这些函数,例如http://www.example.com/hello,因为它们会转义冒号和反斜杠:
http%3A%2F%2Fwww.example.com%2Fhello
应该只编码部分URL(在http://www.example.com/后面的部分),随后再加上协议和域名。

RFC1738编码和解码
要把字符串依照URL约定编码,可以使用rawurlencode():
$output=rawurlencode(input);
该函数接收一个字符串并返回对该字符串的拷贝,该拷贝中把非法URL字符按%dd约定编码。
如果你要为一个页面里的链接动态生成超级链接地址,则需要用rawurlencode()转换它们:
$name="Programming PHP";
$output=rawurlencode($name);
echo "http://localhost/$output";
http://localhost/Programming%20PHP
函数rawurldecode()用于解码被编码过的URL字符串:
$encoded=‘Programming%20PHP‘;
echo rawurldecode($encoded);
Programming PHP

查询字符串编码
urlencode()和urldecode()函数和它们原始版本(即rawurlencode()和rawurldecode())的不同仅在于它们把空格编码为加号(+),而不是%20。这是用于创建查询字符串(query string)和cookie值的格式,但是因为这些值在通过表单或cookie传送时会自动解码,所以你不需要使用这些函数来处理当前页的查询字符串或cookie。这两个函数对于生成查询字符串是很有用的:
$base_url=‘http://www.google.com/q=‘;
$query=‘PHP sessions -cookies‘;
$url=$base_url.urlencode($query);
echo $url;
http://www.google.com/q=PHP+sessions+cookies

SQL:绝大多数数据库系统都要求将SQL查询字符串进行转义。SQL的转义方法相当简单——在单引号、双引号、空字节和反斜杠前面加上一个反斜杠(\)。addslashes()函数可添加这些反斜杠,stripslashes()函数则删除它们:
$string=<<<The_end
"It‘s never going to work," she cried,
as she hit the backslash(\)key.
The_End;
echo addslashes($string);
\"It\‘s never going to work,\"she cried,
as she hit the backslash (\\) key.
echo stripslashes($string);
"It‘s never going to work," she cried,
as she hit the backslash (\) key.
提示:一些数据库(如SYBASE)用另一个单引号为单引号转义,而不是一个反斜杠。对于这些数据库,可以在php.ini文件中打开magic_quotes_sybase。

PHP字符串——编码与转义,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。