1. python正则表达式问题,为什么图中这样写会返回字符串中间的部分,不是应该返回整个字符串吗
对于findall方法,如果模式中出现了一个或多个分组,则返回的是一个分组的列表。
因为你的模式中有一个分组(.*),返回的自然是这个分组匹配到的内容。要返回整个字符串,去掉(.*)中的括号就行了,这样写:'lift.*python'。
2. php referer怎么过滤
php安全篇值过滤用户输入的人参数
规则 1:绝不要信任外部数据或输入
关于Web应用程序安全性,必须认识到的第一件事是不应该信任外部数据。外部数据(outside data) 包括不是由程序员在PHP代码中直接输入的任何数据。在采取措施确保安全之前,来自任何其他来源(比如 GET 变量、表单 POST、数据库、配置文件、会话变量或 cookie)的任何数据都是不可信任的。
例如,下面的数据元素可以被认为是安全的,因为它们是在PHP中设置的。
复制代码 代码如下:
<?php
$myUsername = 'tmyer';
$arrayUsers = array('tmyer', 'tom', 'tommy');define(”GREETING”, 'hello there' . $myUsername);?>
但是,下面的数据元素都是有瑕疵的。
清单 2. 不安全、有瑕疵的代码
复制代码 代码如下:
<?php
$myUsername = $_POST['username']; //tainted!
$arrayUsers = array($myUsername, 'tom', 'tommy'); //tainted!
define(”GREETING”, 'hello there' . $myUsername); //tainted!
?>
为 什么第一个变量 $myUsername 是有瑕疵的?因为它直接来自表单 POST。用户可以在这个输入域中输入任何字符串,包括用来清除文件或运行以前上传的文件的恶意命令。您可能会问,“难道不能使用只接受字母 A-Z 的客户端(Javascrīpt)表单检验脚本来避免这种危险吗?”是的,这总是一个有好处的步骤,但是正如在后面会看到的,任何人都可以将任何表单下载 到自己的机器上,修改它,然后重新提交他们需要的任何内容。
解决方案很简单:必须对 $_POST['username'] 运行清理代码。如果不这么做,那么在使用 $myUsername 的任何其他时候(比如在数组或常量中),就可能污染这些对象。
对用户输入进行清理的一个简单方法是,使用正则表达式来处理它。在这个示例中,只希望接受字母。将字符串限制为特定数量的字符,或者要求所有字母都是小写的,这可能也是个好主意。
清单 3. 使用户输入变得安全
复制代码 代码如下:
<?php
$myUsername = cleanInput($_POST['username']); //clean!
$arrayUsers = array($myUsername, 'tom', 'tommy'); //clean!
define(”GREETING”, 'hello there' . $myUsername); //clean!
function cleanInput($input){
$clean = strtolower($input);
$clean = preg_replace(”/[^a-z]/”, “”, $clean);$clean = substr($clean,0,12);
return $clean;
}
?>
规则 2:禁用那些使安全性难以实施的 PHP 设置已经知道了不能信任用户输入,还应该知道不应该信任机器上配置 PHP 的方式。例如,要确保禁用 register_globals。如果启用了 register_globals,就可能做一些粗心的事情,比如使用 $variable 替换同名的 GET 或 POST 字符串。通过禁用这个设置,PHP 强迫您在正确的名称空间中引用正确的变量。要使用来自表单 POST 的变量,应该引用 $_POST['variable']。这样就不会将这个特定变量误会成 cookie、会话或 GET 变量。
规则 3:如果不能理解它,就不能保护它
一些开发人员使用奇怪的语法,或者将语句组织得很紧凑,形成简短但是含义模糊的代码。这种方式可能效率高,但是如果您不理解代码正在做什么,那么就无法决定如何保护它。
例如,您喜欢下面两段代码中的哪一段?
清单 4. 使代码容易得到保护
复制代码 代码如下:
<?php
//obfuscated code
$input = (isset($_POST['username']) ? $_POST['username']:”);//unobfuscated code
$input = ”;
if (isset($_POST['username'])){
$input = $_POST['username'];
}else{
$input = ”;
}
?>
在第二个比较清晰的代码段中,很容易看出 $input 是有瑕疵的,需要进行清理,然后才能安全地处理。
规则 4:“纵深防御” 是新的法宝
本教程将用示例来说明如何保护在线表单,同时在处理表单的 PHP 代码中采用必要的措施。同样,即使使用 PHP regex 来确保 GET 变量完全是数字的,仍然可以采取措施确保 SQL 查询使用转义的用户输入。
纵深防御不只是一种好思想,它可以确保您不会陷入严重的麻烦。
既然已经讨论了基本规则,现在就来研究第一种威胁:SQL 注入攻击。
防止 SQL 注入攻击
在 SQL 注入攻击 中,用户通过操纵表单或 GET 查询字符串,将信息添加到数据库查询中。例如,假设有一个简单的登录数据库。这个数据库中的每个记录都有一个用户名字段和一个密码字段。构建一个登录表单,让用户能够登录。
清单 5. 简单的登录表单
复制代码 代码如下:
<html>
<head>
<title>Login</title>
</head>
<body>
<form action=”verify.php” method=”post”>
<p><label for='user'>Username</label>
<input type='text' name='user' id='user'/>
</p>
<p><label for='pw'>Password</label>
<input type='password' name='pw' id='pw'/>
</p>
<p><input type='submit' value='login'/></p>
</form>
</body>
</html>
这个表单接受用户输入的用户名和密码,并将用户输入提交给名为 verify.php 的文件。在这个文件中,PHP 处理来自登录表单的数据,如下所示:
清单 6. 不安全的 PHP 表单处理代码
复制代码 代码如下:
<?php
$okay = 0;
$username = $_POST['user'];
$pw = $_POST['pw'];
$sql = “select count(*) as ctr from users where username='”.$username.”' and password='”. $pw.”' limit 1″;$result = mysql_query($sql);
while ($data = mysql_fetch_object($result)){if ($data->ctr == 1){
//they're okay to enter the application!
$okay = 1;
}
}
if ($okay){
$_SESSION['loginokay'] = true;
header(”index.php”);
}else{
header(”login.php”);
}
?>
这 段代码看起来没问题,对吗?世界各地成百(甚至成千)的 PHP/MySQL 站点都在使用这样的代码。它错在哪里?好,记住 “不能信任用户输入”。这里没有对来自用户的任何信息进行转义,因此使应用程序容易受到攻击。具体来说,可能会出现任何类型的 SQL 注入攻击。
例如,如果用户输入 foo 作为用户名,输入 ' or '1′='1 作为密码,那么实际上会将以下字符串传递给 PHP,然后将查询传递给 MySQL:
复制代码 代码如下:
<?php
$sql = “select count(*) as ctr from users where username='foo' and password=” or '1′='1′ limit 1″;?>
这个查询总是返回计数值 1,因此 PHP 会允许进行访问。通过在密码字符串的末尾注入某些恶意 SQL,黑客就能装扮成合法的用户。
解 决这个问题的办法是,将 PHP 的内置 mysql_real_escape_string() 函数用作任何用户输入的包装器。这个函数对字符串中的字符进行转义,使字符串不可能传递撇号等特殊字符并让 MySQL 根据特殊字符进行操作。清单 7 展示了带转义处理的代码。
清单 7. 安全的 PHP 表单处理代码
复制代码 代码如下:
<?php
$okay = 0;
$username = $_POST['user'];
$pw = $_POST['pw'];
$sql = “select count(*) as ctr from users where username='”.mysql_real_escape_string($username).”' and password='”. mysql_real_escape_string($pw).”' limit 1″;$result = mysql_query($sql);
while ($data = mysql_fetch_object($result)){if ($data->ctr == 1){
//they're okay to enter the application!
$okay = 1;
}
}
if ($okay){
$_SESSION['loginokay'] = true;
header(”index.php”);
}else{
header(”login.php”);
}
?>
使用 mysql_real_escape_string() 作为用户输入的包装器,就可以避免用户输入中的任何恶意 SQL 注入。如果用户尝试通过 SQL 注入传递畸形的密码,那么会将以下查询传递给数据库:
select count(*) as ctr from users where username='foo' and password='\' or \'1\'=\'1′ limit 1″数据库中没有任何东西与这样的密码匹配。仅仅采用一个简单的步骤,就堵住了 Web 应用程序中的一个大漏洞。这里得出的经验是,总是应该对 SQL 查询的用户输入进行转义。
但是,还有几个安全漏洞需要堵住。下一项是操纵 GET 变量。
防止用户操纵 GET 变量
在前一节中,防止了用户使用畸形的密码进行登录。如果您很聪明,应该应用您学到的方法,确保对 SQL 语句的所有用户输入进行转义。
但 是,用户现在已经安全地登录了。用户拥有有效的密码,并不意味着他将按照规则行事 —— 他有很多机会能够造成损害。例如,应用程序可能允许用户查看特殊的内容。所有链接指向 template.php?pid=33 或 template.php?pid=321 这样的位置。URL 中问号后面的部分称为查询字符串。因为查询字符串直接放在 URL 中,所以也称为 GET 查询字符串。
在 PHP 中,如果禁用了 register_globals,那么可以用 $_GET['pid'] 访问这个字符串。在 template.php 页面中,可能会执行与清单 8 相似的操作。
清单 8. 示例 template.php
复制代码 代码如下:
<?php
$pid = $_GET['pid'];
//we create an object of a fictional class Page$obj = new Page;
$content = $obj->fetchPage($pid);
//and now we have a bunch of PHP that displays the page?>
这 里有什么错吗?首先,这里隐含地相信来自浏览器的 GET 变量 pid 是安全的。这会怎么样呢?大多数用户没那么聪明,无法构造出语义攻击。但是,如果他们注意到浏览器的 URL 位置域中的 pid=33,就可能开始捣乱。如果他们输入另一个数字,那么可能没问题;但是如果输入别的东西,比如输入 SQL 命令或某个文件的名称(比如 /etc/passwd),或者搞别的恶作剧,比如输入长达 3,000 个字符的数值,那么会发生什么呢?
在这种情况下,要记住基本规则,不要信任用户输入。应用程序开发人员知道 template.php 接受的个人标识符(PID)应该是数字,所以可以使用 PHP 的 is_numeric()函数确保不接受非数字的 PID,如下所示:
清单 9. 使用 is_numeric() 来限制 GET 变量复制代码 代码如下:
<?php
$pid = $_GET['pid'];
if (is_numeric($pid)){
//we create an object of a fictional class Page$obj = new Page;
$content = $obj->fetchPage($pid);
//and now we have a bunch of PHP that displays the page}else{
//didn't pass the is_numeric() test, do something else!
}
?>
这个方法似乎是有效的,但是以下这些输入都能够轻松地通过 is_numeric() 的检查:
100 (有效)
100.1 (不应该有小数位)
+0123.45e6 (科学计数法 —— 不好)
0xff33669f (十六进制 —— 危险!危险!)那么,有安全意识的 PHP 开发人员应该怎么做呢?多年的经验表明,最好的做法是使用正则表达式来确保整个 GET 变量由数字组成,如下所示:
清单 10. 使用正则表达式限制 GET 变量
复制代码 代码如下:
<?php
$pid = $_GET['pid'];
if (strlen($pid)){
if (!ereg(”^[0-9]+$”,$pid)){
//do something appropriate, like maybe logging them out or sending them back to home page}
}else{
//empty $pid, so send them back to the home page}
//we create an object of a fictional class Page, which is now//moderately protected from evil user input$obj = new Page;
$content = $obj->fetchPage($pid);
//and now we have a bunch of PHP that displays the page?>
需 要做的只是使用 strlen() 检查变量的长度是否非零;如果是,就使用一个全数字正则表达式来确保数据元素是有效的。如果 PID 包含字母、斜线、点号或任何与十六进制相似的内容,那么这个例程捕获它并将页面从用户活动中屏蔽。如果看一下 Page 类幕后的情况,就会看到有安全意识的 PHP 开发人员已经对用户输入 $pid 进行了转义,从而保护了 fetchPage() 方法,如下所示:
清单 11. 对 fetchPage() 方法进行转义
复制代码 代码如下:
<?php
class Page{
function fetchPage($pid){
$sql = “select pid,title,desc,kw,content,status from page where pid='”.mysql_real_escape_string($pid).”'”;}
}
?>
您可能会问,“既然已经确保 PID 是数字,那么为什么还要进行转义?” 因为不知道在多少不同的上下文和情况中会使用 fetchPage() 方法。必须在调用这个方法的所有地方进行保护,而方法中的转义体现了纵深防御的意义。
如 果用户尝试输入非常长的数值,比如长达 1000 个字符,试图发起缓冲区溢出攻击,那么会发生什么呢?下一节更详细地讨论这个问题,但是目前可以添加另一个检查,确保输入的 PID 具有正确的长度。您知道数据库的 pid 字段的最大长度是 5 位,所以可以添加下面的检查。
清单 12. 使用正则表达式和长度检查来限制 GET 变量复制代码 代码如下:
<?php
$pid = $_GET['pid'];
if (strlen($pid)){
if (!ereg(”^[0-9]+$”,$pid) && strlen($pid) > 5){//do something appropriate, like maybe logging them out or sending them back to home page}
} else {
//empty $pid, so send them back to the home page}
//we create an object of a fictional class Page, which is now//even more protected from evil user input$obj = new Page;
$content = $obj->fetchPage($pid);
//and now we have a bunch of PHP that displays the page?>
现在,任何人都无法在数据库应用程序中塞进一个 5,000 位的数值 —— 至少在涉及 GET 字符串的地方不会有这种情况。想象一下黑客在试图突破您的应用程序而遭到挫折时咬牙切齿的样子吧!而且因为关闭了错误报告,黑客更难进行侦察。
缓冲区溢出攻击
缓冲区溢出攻击 试图使 PHP 应用程序中(或者更精确地说,在 Apache 或底层操作系统中)的内存分配缓冲区发生溢出。请记住,您可能是使用 PHP 这样的高级语言来编写 Web 应用程序,但是最终还是要调用 C(在 Apache 的情况下)。与大多数低级语言一样,C 对于内存分配有严格的规则。
缓冲区溢出攻击向缓冲区发送大量数据,使部分数据溢出到相邻的内存缓冲区,从而破坏缓冲区或者重写逻辑。这样就能够造成拒绝服务、破坏数据或者在远程服务器上执行恶意代码。
防止缓冲区溢出攻击的惟一方法是检查所有用户输入的长度。例如,如果有一个表单元素要求输入用户的名字,那么在这个域上添加值为 40 的 maxlength 属性,并在后端使用 substr() 进行检查。清单 13 给出表单和 PHP 代码的简短示例。
3. str_getcsv — 解析 CSV 字符串为一个数组
这是整理后的答案,希望能帮到你!
str_getcsv
(PHP 5 >= 5.3.0, PHP 7, PHP 8)
str_getcsv — 解析 CSV 字符串为一个数组
说明
str_getcsv ( string $input , string $delimiter = "," , string $enclosure = '"' , string $escape = "\\" ) : array
以 CSV 字段格式解析字符串输入,并返回包含读取字段的数组。
参数
input
待解析的字符串。
delimiter
设定字段界定符(仅单个字符)。
enclosure
设定字段包裹字符(仅单个字符)。
escape
设置转义字符(仅单个字符)。默认为反斜线(\)。
返回值
返回一个包含读取到的字段的索引数组。
4. PHP 提交表格 插入数据
if($submit)
你改成
if($_POST['submit'])
试试,看看行不行
5. 关于php中mysql mysqli 区别
PHP中mysql有两个概念,一个是mysql数据库,一个是用于操作mysql数据库的扩展(PHP的各种功能都是通过这些底层扩展来实现的)。而你这个问题中的mysql,就指的是扩展。
PHP5开始有了mysqli,按照PHP官方描述,它是mysql增强版扩展。事实上它确实更搞笑更安全,并推荐大家使用。到PHP5.3的时候,原来的mysql扩展已经被标注为过时。而到了PHP7,原mysql扩展被彻底废弃。
所以不管是否使用PHP7,都建议使用mysqli或pdo扩展来操作mysql数据库。
另外,mysqli并不是简单的在原来mysql的方法上加一个i,它是自己一套方法。mysqli同时支持面向过程和面向对象的方式,强烈建议你学者使用面向对象的方式。
6. addslashes — 使用反斜线引用字符串
addslashes
(PHP 4, PHP 5, PHP 7, PHP 8)
addslashes — 使用反斜线引用字符串
说明
addslashes ( string $str ) : string
返回字符串,该字符串为了数据库查询语句等的需要在某些字符前加上了反斜线。这些字符是单引号(')、双引号(")、反斜线(\)与 NUL(null 字符)。
一个使用 addslashes() 的例子是当你要往数据库中输入数据时。 例如,将名字 O'reilly 插入到数据库中,这就需要对其进行转义。 强烈建议使用 DBMS 指定的转义函数 (比如 MySQL 是 mysqli_real_escape_string(),PostgreSQL 是 pg_escape_string()),但是如果你使用的 DBMS 没有一个转义函数,并且使用 \ 来转义特殊字符,你可以使用这个函数。 仅仅是为了获取插入数据库的数据,额外的 \ 并不会插入。 当 PHP 指令 magic_quotes_sybase 被设置成 on 时,意味着插入 ' 时将使用 ' 进行转义。
PHP 5.4 之前 PHP 指令 magic_quotes_gpc 默认是 on, 实际上所有的 GET、POST 和 COOKIE 数据都用被 addslashes() 了。 不要对已经被 magic_quotes_gpc 转义过的字符串使用 addslashes(),因为这样会导致双层转义。 遇到这种情况时可以使用函数 get_magic_quotes_gpc() 进行检测。
参数
str
要转义的字符。
返回值
返回转义后的字符。
范例
示例 #1 一个 addslashes() 例子
参见
stripcslashes() - 反引用一个使用 addcslashes 转义的字符串
stripslashes() - 反引用一个引用字符串
addcslashes() - 以 C 语言风格使用反斜线转义字符串中的字符
htmlspecialchars() - 将特殊字符转换为 HTML 实体
quotemeta() - 转义元字符集
get_magic_quotes_gpc() - 获取当前 magic_quotes_gpc 的配置选项设置
7. php用户登录为什么只能使用第一个用户登录,而之后创建的用户则显示不存在用户,数据库里则有创的用户。
登录这么验证,你那样肯定是错的。就两个表:一个t_admin,一个t_session表。
db.conf这个的:
db.conf
{
"type":"mysql",
"host":"ip",
"port":3306,
"username":"root",
"password":"root"
}
<?php
function getDbConnection($conf="../conf/db.conf")
{
$c = file_get_contents($conf);
if(!$c){
throw newException("get conf failed:" . $conf);
}
$dbconf = json_decode($c,true);
if($dbconf["type"] !="mysql")
{
throw new Exception("db type" . $dbconf["type"] . " not support yet",-1);
}
$port = $dbconf['port'];
if(!$port){
$port = '3306';
}
$db = mysql_connect($dbconf['host'] . ':' .$port,
$dbconf['username'],
$dbconf['password']);
if(!$db){
throw new Exception(mysql_error());
}
return $db;
}
function login(){
$usr = $_REQUEST['name'];
$pwd = $_REQUEST['pwd'];
if(!$usr || !$pwd){
return '{code:-1,msg:"useror pwd not correct"}';
}
$db = getDbConnection();
$usr = mysql_escape_string($usr);
$pwd = mysql_escape_string($pwd);
$sql = 'select user_name,password,authfrom db_stat.t_admin where user_name = "'
. $usr . '" and password ="'
. $pwd . '"';
$rlt = mysql_query($sql) ;
if(!$rlt){
$ret =array("code"=>-1,"msg"=>mysql_error());
return json_encode($ret);
}
$rows = array();
while($row =mysql_fetch_array($rlt,MYSQL_NUM)){
array_push($rows,$row);
}
mysql_free_result($rlt);
if(count($rows) != 1){
return '{code:-1,msg:"user or pwdnot correct"}';
}
$sk = md5($usr . $pwd . time());
$ip = $_SERVER["REMOTE_ADDR"];
$sql = 'insert db_stat.t_sessions(user_name,tocken,login_time,update_time,ip) values("'
. $usr . '","'
. $sk . '",'
. time() . ','
. time() . ',"'
. $ip . '") on plicate keyupdate '
. 'tocken="' . $sk . '",'
. 'login_time=' . time() . ','
. 'update_time=' . time() . ','
. 'ip="' . $ip . '"';
if(!mysql_query($sql)){
$ret =array("code"=>-1,"msg"=>mysql_error());
return json_encode($ret);
}
mysql_close();
$ret =array("code"=>0,"msg"=>"success","auth"=>$rows[0][2]);
$et = time() + 7 * 24 * 3600;
setcookie('usr',$usr,$et,"/");
setcookie('sk',$sk,$et,"/");
return json_encode($ret);
}
function verify(){
if(!isset($_COOKIE['usr']) ||!isset($_COOKIE['sk'])){
return'{code:-1,msg:"verify failed"}';
}
$db = getDbConnection();
$usr =mysql_escape_string($_COOKIE['usr']);
$sk =mysql_escape_string($_COOKIE['sk']);
$sql = 'select login_time from
db_stat.t_sessions where user_name = "' . $usr . '" and tocken =
"' . $sk . '"';
$rlt = mysql_query($sql) ;
if(!$rlt){
mysql_close();
$ret =array("code"=>-1,"msg"=>mysql_error());
return json_encode($ret);
}
$rows = array();
while($row = mysql_fetch_array($rlt,MYSQL_NUM)){
array_push($rows,$row);
}
mysql_free_result($rlt);
if(count($rows) != 1){
mysql_close();
return '{code:-1,msg:"user or pwdnot correct"}';
}
$loginTime = $rows[0][0];
return '{code:0,msg:"success"}';
}
try{
if($_REQUEST['act'] =="login"){
echo login();
}
else if($_REQUEST['act'] =="verify"){
echo verify();
}
}
catch(Exception$e){
$ret =array("code"=>-1,"msg"=>$e->getMessage());
echo json_encode($ret);
}
8. 如何写出好的 PHP 代码
编写良好的代码是一种艺术。如果一个程序员遵循一些良好的编程习惯,那么他就可以成为一个优秀的程序员。实际上,相对于你写代码的时间,你很可能会花更多的时间在代码维护上;更不用说整个应用程序的维护。建立良好的编码习惯,能够提高像模块化这样的设计因素,你的代码也将更容易理解,因此,维护起来更容易、成本更低。而不良的编码习惯会在代码中存在缺陷,并可能导致代码很难维护。 在本文中,我们将探讨一些良好的编程习惯,这将帮助你避免代码中的缺陷。 1- 编写模块化代码 良好的PHP代码应该是模块化代码。PHP的面向对象的编程功能是一些特别强大的工具,可以把你的应用程序分解成函数或方法。你应该尽可能多的从你的应用程序的服务器端分开前端的HTML/CSS/JavaScript代码。你也可以在任何PHP框架上遵循MVC(模型-视图-控制器)模式。 2- 代码编写规范 良好的PHP代码应该有一套完整的代码编写规范。通过对变量和函数的命名,统一的方法访问数据库和对错误的处理,以及同样的代码缩进方式等来达到编程规范,这样可以使你的代码更具可读性。 3- 编写可移植代码 良好的PHP代码应该是可移植的。你可以使用php的现有功能,如魔术引号和短标签。试着了解你的需求,然后通过适应PHP特性来编写代码让代码独立、可移植。 4- 编写安全代码 良好的PHP代码应该是安全的。PHP5提供了出色的性能和灵活性。但是安全问题完全在于开发人员。对于一个专业的PHP开发人员来说,深入理解重大安全漏洞是至关重要的,如:跨站点脚本(XSS)、跨站请求伪造(CSRF)、代码注入漏洞、字符编码漏洞。通过使用PHP的特殊功能和函数,如:mysql_real_escape_string等等,你可以编写出安全的代码。 6- 避免短标签 把所有用到短标签的替换成完整的PHP标签。 7- 使用单引号代替双引号 字符串始终使用单引号代替双引号,以避免PHP搜索字符串内的变量导致的性能下降。 8- 转义字符串输出 使用ENT_QUOTES作参数传递给htmlspecialchars函数,以确保单引号(')也转换成HTML实体,这是一个好习惯。 9- 使用逗号分隔字符串输出 通过echo语句输出使用逗号(,)分隔的字符串,要比使用字符串连接操作符(.)的性能更好。 10- 输出前检查传来的值输出前检查传过来的值$_GET['query']。使用isset或empty函数,可以用来检查变量是否为null值。
9. PHP接收URL中的参数的问题
首先 &是网址里的变量分割符合 如果不是必须 强烈不推荐
a.php?x=abc%2Bdefgh&d=123456
这样就获取两个参数
$_GET['x'] 和$_GET['d];
你这样一搞就全乱了
如果非要这样的话,我试着帮你写个
<?
$str= $_SERVER['QUERY_STRING'];
$str=split('=',$str)
$x=urldecode($str[1]);
echo $x;
?>
10. PHP输出全角空格,导致页面布局混乱
$str='<ul>';
for($i=0;$i<=10;$i++){
$str.='<li><a href="'.$i.'.php">'.$i.'</a></li>';
}
echo $str.'</ul>';
a标签忘记结尾了吧,我这里IE6,7,8,9,火狐,chrome测试没问题