php中preg_match长字符串匹配失败问题解决

 更新时间:2016年11月25日 17:39  点击:2078
文章介绍了一个在php开发中常碰到的问题,preg_match长字符串匹配失败,有碰到相同问题的同学可参考一下。

字符串比较长,因此怀疑是不是preg_match也有字符串长度限制,果然!
preg_match、preg_match_all都会有这种情况。

解决方法:
1、ini_set(‘pcre.backtrack_limit’, 1000000); //默认的只有100000
2、修改 php.ini 的pcre.backtrack_limit参数,使之支持更大的字符串。加入配置:pcre.backtrack_limit=-1

 

本文章收藏了php开发中常常会碰到的一些疑惑或一些小问题,大家可参考一下。

上面一些函数之间的区别,

1.isset()和empty()的区别
两者都是测试变量用的。但是isset()是测试变量是否被赋值,而empty()是测试一个已经被赋值的变量是否为空。如果一个变量没被赋值就引用在php里是被允许的,但会有notice提示。如果一个变量被赋空值,$foo=”"或者$foo=0或者$foo=false,那么empty($foo)返回真,isset($foo)也返回真,就是说赋空值不会注销一个变量。要注销一个变量,可以用 unset($foo)或者$foo=NULL。
2.如何显示错误信息
当php.ini的display_errors = On并且error_reporting = E_ALL时,将显示所有的错误和提示,调试的时候最好打开以便纠错,如果你用以前php写法错误信息多半是关于未定义变量的。变量在赋值以前调用会有提示,解决办法是探测或者屏蔽
3.单引号 双引号什么区别?分别什么时侯用
单引号中,任何变量($var)、特殊转义字符(如”t r n”等)不会被解析,因此PHP的解析速度更快,转义字符仅仅支持”’”和””这样对单引号和反斜杠本身的转义;双引号中,变量($var)值会代入字符串中,特殊转义字符也会被解析成特定的单个字符,还有一些专门针对上述两项特性的特殊功能性转义,例如”$”和”。这样虽然程序编写更加方便,但同时PHP的解析也很慢;数组中,如果下标不是整型,而是字符串类型,请务必用单引号将下标括起,正确的写法为$array['key'],而不是$array[key],因为不正确的写法会使PHP解析器认为key是一个常量,进而先判断常量是否存在,不存在时才以”key”作为下标带入表达式中,同时出发错误事件,产生一条Notice级错误。因此,在绝大多数可以使用单引号的场合,不要使用双引号。
4.print,echo,print_r什么区别?分别什么时侯用?
echo和print都可以做输出,不同的是,echo不是函数,没有返回值,而print是一个函数有返回值,所以相对而言如果只是输出 echo 会更快,而print_r通常用于打印变量的相关信息,通常在调试中使用
5.在PHP中有些时候需要打开远程文件
打开远程文件函数为:fopen(http://XXX.com/a.php),fsockopen(http://XXX.com/a.php) , file_get_contents(http://XXX.com/a.php)等)
在php5,apache2.2.X环境下,会提示你无法打开文件流,http请求失败(failed to open stream: HTTP request failed!)
在php.ini中,有这样两个选项:
allow_url_fopen =on(表示可以通过url打开远程文件),
user_agent=”PHP”(表示通过哪种脚本访问网络,默认前面有个 ” ; ” 去掉即可。)
重启Apache服务即可。
6.如何预先获取auto_increment的值?
mysql_connect(’localhost’,'root’,'root’) or die(’不能连接到服务器‘);
mysql_select_db(’test’);                      //连接数据库
$sql = “show create table id_user”;     //id_userd 为表名
$query = mysql_query($sql);
$arr = mysql_fetch_array($query);
$b = strstr($arr[1],’AUTO_INCREMENT=’);       //获取子字符串,包含AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 )
$result = intval(substr($b,15));              //substr()从字符串第16个位置获取字符串,再对获取后的字符串进行int类型转换
echo ‘AUTO_INCREMENT的值’ .$result;           //输出结果:即为下一次插入数据时的ID值
7.利用获得客户端信息
getenv(”REMOTE_ADDR”)可以得到浏览者的IP
getenv(”HTTP_USER_AGENT”)可以得到浏览者的操作系统类型,浏览器类型
getenv能得到所有$_ENV这个全局变量的所有东西
print_r($_ENV)可以看到很多东西
比如
echo getenv(ALLUSERSPROFILE);    可以看到ALLUSERSPROFILE的值
echo getenv(PATHEXT);            可以看到PATHEXT的值
8.mysql_fetch_row()和mysql_fetch_array()的区别
mysql_fetch_array() 是 mysql_fetch_row() 的扩展版本。除了将数据以数字索引方式储存在数组中之外,还可以将数据作为关联索引储存,用字段名作为键名。用 mysql_fetch_array()并不明显比用 mysql_fetch_row()慢,而且还提供了明显更多的值。
mysql_fetch_array() 中可选的第二个参数 result_type 是一个常量,可以接受以下值:MYSQL_ASSOC,MYSQL_NUM 和MYSQL_BOTH。本特性是PHP 3.0.7 起新加的。本参数的默认值是 MYSQL_BOTH。
9.EOD的用法和功效
就是比单引号和双引号好些,能包含换行。EOD可以改成其他字符。
10.用gdate()获得一长串数字怎么转换成正常的时间?
gmdate 返回 GMT 时间,除此以外和 date() 函数完全一样。如果你需要本地时间,就用 date() 来格式化时间戳。
11.正则里面的()//区别何在?
/ / 是模式定界符,代表里面是一个正则规则。
( ) 代表的是子模式,一个/ /中可以有很多的( )组成,可以用1 2 或 $1 $2来匹配前面子模式的值。
12.require和require_once有啥区别?
require重复调用会多次加载你饮用的文件;require_once只加载一次,而不管你实际上调用了多少次,主要用于复杂的文件包含关系
例如b包含a,c包含a,但同时c又包含了b,那么如果用require的话可能会导致两次加载a
13.三个IP地址的获取有什么区别?
$_SERVER['REMOTE_ADDR'];
$_SERVER['HTTP_CLIENT_IP'];
$_SERVER['HTTP_X_FORWARDED_FOR'];
$_SERVER['REMOTE_ADDR'];          //访问端(有可能是用户,有可能是代理的)IP
$_SERVER['HTTP_CLIENT_IP'];        //代理端的(有可能存在,可伪造)
$_SERVER['HTTP_X_FORWARDED_FOR'];  //用户是在哪个IP使用的代理(有可能存在,也可以伪造)
14.$_GET和$_POST的区别?
一:get 方法是限制传值的大小,不能超过2K. 而post不限制传值的大小.
二:Get是用来从服务器上获得数据,而Post是用来向服务器上传递数据。
三:Get将表单中数据的按照variable=value的形式,添加到action所指向的URL后面,并且两者使用”?”连接,而各个变量之间使用”&”连接;Post是将表单中的数据放在form的数据体中,按照变量和值相对应的方式,传递到action所指向URL。
四:Get是不安全的,因为在传输过程,数据被放在请求的URL中,而如今现有的很多服务器、代理服务器或者用户代理都会将请求URL记录到日志文件中,然后放在某个地方,这样就可能会有一些隐私的信息被第三方看到。另外,用户也可以在浏览器上直接看到提交的数据,一些系统内部消息将会一同显示在用户面前。Post的所有操作对用户来说都是不可见的。
15.在类里面的函数前面可以加public,private,但在函数库中的函数前面不能加呢?
function自定的随便你,public是公开使用的类属性对象,privat是独立使用的类属性对象;
类中 public 或 private 是指这个方法(要注意叫”方法”)是对外公开还是是属于类私有而你指的函数库,它是”函数”的库,不属于类中的方法,所以不必也不能有前置修饰。
16.页面执行时间怎么算的?

 代码如下 复制代码
$mtime = explode(’ ‘, microtime());
$starttime = $mtime[1] + $mtime[0];
……
……
……
$mtime = explode(’ ‘, microtime());
$endtime = $mtime[1] + $mtime[0];
$usedtime = $endtime - $starttime;
printf(”<br />%0.4f s”, $usedtime);

17. UTF8编码脚本session_start(),header(),settcookie()等函数出错,提示”headers already sent “。
UTF8编码脚本通常的编辑器都会在文件头部加上三字节的BOM编码来识别UTF8编码格式,这三个字节是普通文件编辑器看不到,而输出时去先行以HTML输出了。执行以上函数时就会提示以上错误。解决办法:用editplus等可以清除BOM的编辑器,清除BOM(设置为utf8清除BOM)保存一下即可。
18. PHP中单引号,双引号,反引号的区别
PHP单引号(’),双引号(”")反引号(`)都能引用字串。单引号中变量不被转义,双引号转义变量,而反引号中变量转义作为shell命令被执行。

下成介绍了一些常开发中的问题

下面我们从较轻微的问题开始讨论,直至一些致命的错误。共分三部分。
  第一部分、较轻微的错误
    一、Printf(),
    该函数主要用来格式化显示数据。当你要改变某个数据的显示格式时才使用。
  例如以不同的精度来显示PI(3.1415926)的值。

 代码如下 复制代码
<?php
   
   printf ("Pi is: %.2fn<br>n", M_PI);
   printf ("Pi is also: %.3fn<br>n", M_PI);
   printf ("Pi is also: %.4fn<br>n", M_PI);
  ?>

    但许多程序员仅仅为显示一些变量值和函数返回值使用该函数。因为Printf()在显示数据前要先格式化该数据以速度较慢,因此,仅为了显示数据时应用print和echo,以提高速度。
   二、语意检查
    PHP是一种弱类型语言,也就是说在使用一个变量前不用定义,这样给编程带来了很大的方便和灵活,但你自己必须知道该变量到底应该是哪种类型,因为该变量在运行时仍实际对应着某一种类型(各种类型

之间可以自由互相转换),没有类型的变量是不存在的。有可能PHP并不能检查出你的语意错误,但由于变量类型的变化,会导致一些潜在的问题的发生。另外一个值得注意的问题是变量的范围,它也可能会导致

一些潜在的问题的发生。
  在PHP中有以下几种基本变量:
  Boolean, resource, integer, double, string, array and object。
   三、临时变量的使用
    临时变量的滥用会导致程序运行效率的降低。何时使用临时变量可基于以下两点考虑:
  1、该变量是否至少使用两次。
  2、该变量的使用是否会显著提高程序的可读性。
  如果一条也不满足,则省略该变量的使用。例如:

 代码如下 复制代码

<?php
   $tmp = date ("F d, h:i a"); 
   print $tmp;
  ?>
  就应该改成:
  <?php
   print date ("F d, h:i a");
  ?>
  
  又如:

  <?php
  
  // string reverse_characters(string str)
  // Reverse all of the characters in a string.
  function reverse_characters ($str)
  {
   return implode ("", array_reverse (preg_split("//", $str)));
  }
  
  ?>

  的可读性不强,可改成: 
 

 代码如下 复制代码
<?php
  
  // string reverse_characters(string str)
  // Reverse all of the characters in a string.
  function reverse_characters ($str)
  {
   $characters = preg_split ("//", $str);
   $characters = array_reverse ($characters);
  
   return implode ("", $characters);
  }
  
  ?>
  

网络找到的一些问题


php中常见问题集锦2009-09-10 11:07【1】页面之间无法传递变量
get,post,session在最新的php版本中自动全局变量是关闭的,所以要从上一页面取得提交过来得变量要使用$_GET['foo'],$_POST['foo'],$_SESSION['foo']来得到
当然也可以修改自动全局变量为开(php.ini改为register_globals = On);考虑到兼容性,还是强迫自己熟悉新的写法比较好。

【2】Win32下apache2 用get方法传递中文参数会出错
test.php?a=你好&b=你也好
传递参数是会导致一个内部错误
解决办法:"test.php?a=".urlencode(你好)."&b=".urlencode(你也好)

【3】win32下的session不能正常工作
php.ini默认的session.save_path = /tmp
这显然是linux下的配置,win32下php无法读写session文件导致session无法使用
把它改成一个绝对路径就可以了,例如session.save_path = c:windowstemp

【4】显示错误信息
当php.ini的display_errors = On并且error_reporting = E_ALL时,将显示所有的错误和提示,调试的时候最好打开以便纠错,如果你用以前php写法错误信息多半是关于未定义变量的。变量在赋值以前调用会有提示,解决办法是探测或者屏蔽
例如显示$foo,可以if(isset($foo)) echo $foo 或者echo @$foo

【5】Win32下mail()不能发送电子邮件
在linux下配置好的sendmail可以发送,在win32下需要调用smtp服务器来发送电子邮件
修改php.ini的SMTP = ip //ip是不带验证功能的smtp服务器(网上很难找到)
php发送邮件的最好解决方法是用socket直接发送到对方email服务器而不用转发服务器
有个很好的class,不过需要修改一下发信会暴快,修改后版本将在近日推出

【6】header already sent这个错误通常会在你使用HEADER的时候出现,他可能是几种原因:
1,你在使用HEADER前PRING或者ECHO了
2.你当前文件前面有空行
3.你可能INCLUDE了一个文件,该文件尾部有空行或者输出也会出现这种错误。!
还有使用session_register()

【7】初装的mysql如果没有设置密码,应该使用
update mysql.user set password=password("yourpassword") where user="root"

【8】更改php.ini后没有变化
重新启动web server,比如IIS,Apache等等,然后才会应用最新的设置

【9】php在2003上面安装(ISAPI的安装方法)
PHP4的php4isapi.dll好像和2003有些冲突,只能用CGI模式安装

步骤一,先去在一个安装程序,我是装的是:php-4.2.3-installer.exe,你也可以去找最新的版本,在安装 php-4.2.3-installer.exe之前保证你的IIS6.0启动了,并能够访问。 安装好以后,在默认网站-->应用程序配置
步骤二:点击 web服务扩展 -->新建web服务扩展.
步骤三: 扩展名-->php,然后添加
步骤四:找到php.exe的路径添加上去。
步骤五: 确定就可以了!
步骤六: 选择php的服务扩展,然后点击允许。

【10】有时候sql语句不起作用,对数据库操作失败
最简便的调试方法,echo那句sql,看看变量的值能不能得到

【11】

 代码如下 复制代码

<?php

// 自 PHP 3 起可用
print $HTTP_POST_VARS['username'];

// 自 PHP 4.1.0 起可用
print $_POST['username'];
print $_REQUEST['username'];

import_request_variables('p', 'p_');
print $p_username;


// 如果PHP指令 register_globals = on 时可用。不过自PHP 4.2.0 起默认值为 register_globals = off不提倡使用此种方法。
print $username;
?>

使用 GET 表单也类似,只不过要用适当的 GET 预定义变量。GET 也适用于 QUERY_STRING(URL 中在“?”之后的信息)。因此,举例说,http://www.example.com/test.php?id=3 包含有可用 $_GET['id'] 访问的 GET 数据。参见 $_REQUEST 和 import_request_variables()。
在 PHP 4.2.0 之前 register_globals 的默认值是 on。在 PHP 3 中其值总是 on。鼓励大家不要依赖此指令,建议在编码时假定其为 off。

 

【12】暂存你的变量到临时文件:

 代码如下 复制代码

if(file_exists('temp.php'))
{
$x=r('temp.php');
@eval("$a = $x;");
}
if(!is_array($a)){
#重新构造数组A
$a=array(array("af"=>"fsdf"),"f"=>"df");
}
w('temp.php',var_export($a,true));

var_dump($a);
读取,写入文档数据
function r($file_name)
{
$filenum=@fopen($file_name,"r");
@flock($filenum,LOCK_SH);
$file_data=@fread($filenum,filesize($file_name));
@fclose($filenum);
return $file_data;
}
function w($file_name,$data,$method="w")
{
$filenum=@fopen($file_name,$method);
flock($filenum,LOCK_EX);
$file_data=fwrite($filenum,$data);
fclose($filenum);
return $file_data;
}

【13】include和require的区别
两者没有太大的区别,如果要包含的文件不存在,include提示notice,然后继续执行下面的语句,require提示致命错误并且退出;据我测试,win32平台下它们都是先包含后执行,所以被包含文件里最好不要再有include或require语句,这样会造成目录混乱。或许linux下情况不同,暂时还没测试;如果一个文件不想被包含多次可以使用include_once或require_once

【14】session在函数和方法中的应用:你打算注册进session的变量都必须是全局的。

原因是这样的:
php的session_register函数只是记住变量的名字,而不会去记变量的值。
真正要在服务器端记住这个变量的值是在整个脚本运行结束之后,也就是说变量的值是在脚本运行结束的时候才会被读取并保存入服务器端的临时目录,这样,在所有函数或方法外的、或在函数或方法内被定义为全局变量的变量才会成功register,而其他的则都会在脚本运行结束时被unset掉。

【15】PHP中的session由于基于cookie实现,所以在所有会话窗口关闭后并不会马上消失。这一点和其他脚本语言不同,同时让我感到郁闷。

答:不不不,楼上的朋友没有把php的session研究透,如果非要说php的session跟cookie有关系,那也就是一个session_id被记录在了客户端
而在服务器端的临时目录下,会生成一个跟session_id大致同名的文件,这个文件才是真正记录你成功register过的变量和它们的值。同样,如果客户端禁止使用cookie,php会自动以get的方式传递session_id的值,使其不会丢失。所以,cookie跟session之间的关系,并不是那么密不可分。而且,php的session也不能说是基于cookie实现的。

【16】isset()和empty()的区别
如果一个变量没被赋值就引用在php里是被允许的,但会有notice提示;
两者都是测试变量用的,但是isset()是测试变量是否被赋值,而empty()是测试一个已经被赋值的变量是否为空
如果一个变量被赋空值,$foo=""或者$foo=0或者 $foo=false,那么empty($foo)返回真,isset($foo)也返回真,就是说赋空值不会注销一个变量。要注销一个变量,可以用 unset($foo)或者$foo=NULL

【17】通过HTTP协议一次上传多个文件的方法
有两个思路,是同一个方法的两种实现。
1,在form中设置多个文件输入框,用数组命名他们的名字,如下:

 代码如下 复制代码

<form action="" method=post enctype="multipart/form-data">
<input type=file name=usefile[]>
<input type=file name=usefile[]>
<input type=file name=usefile[]>
</form>
这样,在服务器端做以下测试
echo "<pre>";
print_r($_FILES);
echo "</pre>";

2,在form中设置多个文件输入框,但名字不同,如下:
<form action="" method=post enctype="multipart/form-data">
<input type=file name=usefile_a>
<input type=file name=usefile_b>
<input type=file name=usefile_c>
</form>
在服务器端做同样测试:
echo "<pre>";
print_r($_FILES);
echo "</pre>";

【18】可以创建一个临时的PHP格式的文件,在需要的地方include进来,这样临时的PHP文件中定义的变量就有了,可以取代session。

【19】正如上面说得,现在get,post方式提交的都无法直接使用,有时甚是麻烦,自己写了段代码,把他们转化为全局变量,以便使用,session变量同理可得。
把通过GET或POST方式提交的变量转化为全局变量:

 代码如下 复制代码
foreach($_GET as $key=>$value){
$$key=$value;
}
foreach($_POST as $key=>$value){
$$key=$value;
}
本文章详细的介绍了关于php header中Content-disposition用法详细,有需要了解header用法的朋友可参考一下。

Content-disposition 是 MIME 协议的扩展,MIME 协议指示 MIME 用户代理如何显示附加的文件。Content-disposition其实可以控制用户请求所得的内容存为一个文件的时候提供一个默认的文件名,文件直接在浏览器上显示或者在访问时弹出文件下载对话框。


格式说明:

content-disposition = "Content-Disposition" ":" disposition-type *( ";" disposition-parm )  

 

字段说明:

Content-Disposition为属性名

disposition-type是以什么方式下载,如attachment为以附件方式下载

disposition-parm为默认保存时的文件名

        服务端向客户端游览器发送文件时,如果是浏览器支持的文件类型,一般会默认使用浏览器打开,比如txt、jpg等,会直接在浏览器中显示,如果需要提示用户保存,就要利用Content-Disposition进行一下处理,关键在于一定要加上attachment:

 代码如下 复制代码

Response.AppendHeader("Content-Disposition","attachment;filename=FileName.txt");

备注:这样浏览器会提示保存还是打开,即使选择打开,也会使用相关联的程序比如记事本打开,而不是IE直接打开了。

Content-Disposition就是当用户想把请求所得的内容存为一个文件的时候提供一个默认的文件名。具体的定义如下:

 代码如下 复制代码

content-disposition = “Content-Disposition” “:”

disposition-type *( “;” disposition-parm )

disposition-type = “attachment” | disp-extension-token

disposition-parm = filename-parm | disp-extension-parm

filename-parm = “filename” “=” quoted-string

disp-extension-token = token

disp-extension-parm = token “=” ( token | quoted-string )

那么由上可知具体的例子:

Content-Disposition: attachment; filename=“filename.xls”

       当然filename参数可以包含路径信息,但User-Agnet会忽略掉这些信息,只会把路径信息的最后一部分做为文件名。当你在响应类型为application/octet- stream情况下使用了这个头信息的话,那就意味着你不想直接显示内容,而是弹出一个”文件下载”的对话框,接下来就是由你来决定“打开”还是“保存” 了。

注意事项:

1.当代码里面使用Content-Disposition来确保浏览器弹出下载对话框的时候。 response.addHeader("Content-Disposition","attachment");一定要确保没有做过关于禁止浏览器缓存的操作。如下:

 代码如下 复制代码

response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "No-cache");
response.setDateHeader("Expires", 0);

不然会发现下载功能在opera和firefox里面好好的没问题,在IE下面就是不行

今天 在开发时碰到了关于Parse error: syntax error, unexpected $end 错误 提示,根据自己 的要验这里可能是 if else未成对出现,下面我们来总结一下问题和解决办法。

也许是不熟悉的php的一些特性吧,不过写多了,也就慢慢适应将就了.....

这里就整理一个代码编写调试问题,错误如下:

Parse error: syntax error, unexpected $end in D:xampphtdocsguestBookguestBook.php on line 330

看看程序 330行,代码最后一行,这有什么错误?google搜,找到了:

In PHP 5, the following error may appears as an error entry in Apache error log or simply displays on PHP web page, even if calling to php scripts with php_info() works perfectly and successfully returns information on PHP configurations:

Parse Error: syntax error, unexpected $end in ….. scripts.php on line …

The error may caused by a missing curly bracket in PHP script coding. Beside, it may also caused by error in PHP coding in class definition, as in PHP, a class definition cannot be broke up and distributed into multiple files, or into multiple PHP blocks, unless the break is within a method declaration.

But more commonly, the error is often caused by the use of Short Open tags in PHP,

To use short open tags, it must be enabled in PHP.INI. Search for short_open_tag in PHP.INI, and change the value to On. The line should look line:

short_open_tag = On

欺我英文不好啊?看看其它几条搜索,都没说到点子上,那就看看英文了,虽不能如数翻译,大致意思是瞧明白了:

错误发生是使用了短标签,可以在php.ini中设置short_open_tag = On

原来Parse error 提示一般是 语法错误,使用了开放的标签,语句没有结束 也就是编程基本的一些错, 比如没注意 语句结束加 ";" 或者 if(){...} 后面忘了"}" ;<?php...?>忘了"?>"。仔细检查代码,果然是一处漏掉了"}",修改程序正常运行

实例


conn.php
<?php

/*
 * PHP100Job v1.0
 * Programmer : Msn/QQ haowubai@hotmail.com (925939)
 * www.php100.com Develop a project PHP - MySQL - Apache
 * Window 2003 - Preferences - PHPeclipse - PHP - Code Templates
 */

$conn = @ mysql_connect("localhost", "root", "dong") or die("数据库链接错误");
mysql_select_db("news", $conn);
mysql_query("set names 'GBK'"); //使用GBK中文编码;

function htmtocode($content) {
$content = str_replace("n", "<br>", str_replace(" ", "&nbsp;", $content));
return $content;
}

//$content=str_replace("'","‘",$content);
 //htmlspecialchars();
 

?>

<?php

/*
 * PHP100Job v1.0
 * Programmer : Msn/QQ haowubai@hotmail.com (925939)
 * www.php100.com Develop a project PHP - MySQL - Apache
 * Window 2003 - Preferences - PHPeclipse - PHP - Code Templates
 */
 include("conn.php");

 include("head.php");
  $SQL="SELECT * FROM `message` order by id desc";
  $query=mysql_query($SQL);
  while($row=mysql_fetch_array($query)){
?>

<table width=500 border="0" cellpadding="5" cellspacing="1" bgcolor="#add3ef">
  <tr bgcolor="#eff3ff">
  <td>标题:<?=$row[title]?> 用户:<?=$row[user]?></td>
  </tr>
  <tr bgColor="#ffffff">
  <td>内容:<?
 echo htmtocode($row[content]);
  ?></td>
  </tr>
</table>
<?
  }
?>
运行出现下边的错误
Parse error: syntax error, unexpected $end in E:wampwwwleave_messagelist.php on line 35

报错的原因在这里
<?
  }
?>
改成
<?php
  }
?>

解决 办法

你把标题、内容,用户那三个改成<?php echo $row['title'];?>这样的就行了啊。函数就<?php echo htmtocode($row[content]); ?>

这不是主要的,至多只是显示不出数据
报错的原因在这里
<?
}
?>
改成
<?php
}
?>

本文章介绍了关于php中json_decode()和json_encode()用法与中文不显示解决办法,有需要的朋友可以参考一下下。

php中json_decode()和json_encode()

1.json_decode()

json_decode
(PHP 5 >= 5.2.0, PECL json >= 1.2.0)

json_decode — 对 JSON 格式的字符串进行编码

说明
mixed json_decode ( string $json [, bool $assoc ] )
接受一个 JSON 格式的字符串并且把它转换为 PHP 变量

参数

json
待解码的 json string 格式的字符串。

assoc
当该参数为 TRUE 时,将返回 array 而非 object 。


返回值
Returns an object or if the optional assoc parameter is TRUE, an associative array is instead returned.

范例

Example #1 json_decode() 的例子

 代码如下 复制代码

<?php
$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
var_dump(json_decode($json));
var_dump(json_decode($json, true));
?>

上例将输出:

object(stdClass)#1 (5) {
["a"] => int(1)
["b"] => int(2)
["c"] => int(3)
["d"] => int(4)
["e"] => int(5)
}

array(5) {
["a"] => int(1)
["b"] => int(2)
["c"] => int(3)
["d"] => int(4)
["e"] => int(5)
}


$data='[{"Name":"a1","Number":"123","Contno":"000","QQNo":""},{"Name":"a1","Number":"123","Contno":"000","QQNo":""},{"Name":"a1","Number":"123","Contno":"000","QQNo":""}]';
echo json_decode($data);

结果为:

Array ( [0] => stdClass Object ( [Name] => a1 [Number] => 123 [Contno] => 000 [QQNo] => ) [1] => stdClass Object ( [Name] => a1 [Number] => 123 [Contno] => 000 [QQNo] => ) [2] => stdClass Object ( [Name] => a1 [Number] => 123 [Contno] => 000 [QQNo] => ) )

可以看出经过json_decode()编译出来的是对象,现在输出json_decode($data,true)试下

 代码如下 复制代码

echo json_decode($data,true);

结果:

Array ( [0] => Array ( [Name] => a1 [Number] => 123 [Contno] => 000 [QQNo] => ) [1] => Array ( [Name] => a1 [Number] => 123 [Contno] => 000 [QQNo] => ) [2] => Array ( [Name] => a1 [Number] => 123 [Contno] => 000 [QQNo] => ) )

可以看出 json_decode($data,true)输出的一个关联数组,由此可知json_decode($data)输出的是对象,而json_decode("$arr",true)是把它强制生成PHP关联数组.

2.json_encode()

json_encode
(PHP 5 >= 5.2.0, PECL json >= 1.2.0)

json_encode — 对变量进行 JSON 编码

Report a bug 说明
string json_encode ( mixed $value [, int $options = 0 ] )
返回 value 值的 JSON 形式

Report a bug 参数

value
待编码的 value ,除了resource 类型之外,可以为任何数据类型

该函数只能接受 UTF-8 编码的数据

options
由以下常量组成的二进制掩码: JSON_HEX_QUOT, JSON_HEX_TAG, JSON_HEX_AMP, JSON_HEX_APOS, JSON_NUMERIC_CHECK, JSON_PRETTY_PRINT, JSON_UNESCAPED_SLASHES, JSON_FORCE_OBJECT, JSON_UNESCAPED_UNICODE.

Report a bug 返回值
编码成功则返回一个以 JSON 形式表示的 string 或者在失败时返回 FALSE 。

Report a bug 更新日志
版本 说明
5.4.0 options 参数增加常量: JSON_PRETTY_PRINT, JSON_UNESCAPED_SLASHES, 和 JSON_UNESCAPED_UNICODE。
5.3.3 options 参数增加常量:JSON_NUMERIC_CHECK。
5.3.0 增加 options 参数.


Report a bug 范例

Example #1 A json_encode() 的例子

 代码如下 复制代码

<?php
$arr = array ('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5);

echo json_encode($arr);
?>

以上例程会输出:

{"a":1,"b":2,"c":3,"d":4,"e":5}

Example #2 json_encode() 函数中 options 参数的用法

<?php
$a = array('<foo>',"'bar'",'"baz"','&blong&', "xc3xa9");

echo "Normal: ", json_encode($a), "n";
echo "Tags: ", json_encode($a, JSON_HEX_TAG), "n";
echo "Apos: ", json_encode($a, JSON_HEX_APOS), "n";
echo "Quot: ", json_encode($a, JSON_HEX_QUOT), "n";
echo "Amp: ", json_encode($a, JSON_HEX_AMP), "n";
echo "Unicode: ", json_encode($a, JSON_UNESCAPED_UNICODE), "n";
echo "All: ", json_encode($a, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP | JSON_UNESCAPED_UNICODE), "nn";

$b = array();

echo "Empty array output as array: ", json_encode($b), "n";
echo "Empty array output as object: ", json_encode($b, JSON_FORCE_OBJECT), "nn";

$c = array(array(1,2,3));

echo "Non-associative array output as array: ", json_encode($c), "n";
echo "Non-associative array output as object: ", json_encode($c, JSON_FORCE_OBJECT), "nn";

$d = array('foo' => 'bar', 'baz' => 'long');

echo "Associative array always output as object: ", json_encode($d), "n";
echo "Associative array always output as object: ", json_encode($d, JSON_FORCE_OBJECT), "nn";
?>

以上例程会输出:

Normal: ["<foo>","'bar'",""baz"","&blong&","u00e9"]
Tags: ["u003Cfoou003E","'bar'",""baz"","&blong&","u00e9"]
Apos: ["<foo>","u0027baru0027",""baz"","&blong&","u00e9"]
Quot: ["<foo>","'bar'","u0022bazu0022","&blong&","u00e9"]
Amp: ["<foo>","'bar'",""baz"","u0026blongu0026","u00e9"]
Unicode: ["<foo>","'bar'",""baz"","&blong&","é"]
All: ["u003Cfoou003E","u0027baru0027","u0022bazu0022","u0026blongu0026","é"]

Empty array output as array: []
Empty array output as object: {}

Non-associative array output as array: [[1,2,3]]
Non-associative array output as object: {"0":{"0":1,"1":2,"2":3}}

Associative array always output as object: {"foo":"bar","baz":"long"}
Associative array always output as object: {"foo":"bar","baz":"long"}

Example #3 连续与非连续数组示例

 代码如下 复制代码

<?php
echo "连续数组".PHP_EOL;
$sequential = array("foo", "bar", "baz", "blong");
var_dump(
$sequential,
json_encode($sequential)
);

echo PHP_EOL."非连续数组".PHP_EOL;
$nonsequential = array(1=>"foo", 2=>"bar", 3=>"baz", 4=>"blong");
var_dump(
$nonsequential,
json_encode($nonsequential)
);

echo PHP_EOL."删除一个连续数组值的方式产生的非连续数组".PHP_EOL;
unset($sequential[1]);
var_dump(
$sequential,
json_encode($sequential)
);
?>

以上例程会输出:

 代码如下 复制代码

连续数组
array(4) {
[0]=>
string(3) "foo"
[1]=>
string(3) "bar"
[2]=>
string(3) "baz"
[3]=>
string(5) "blong"
}
string(27) "["foo","bar","baz","blong"]"

非连续数组
array(4) {
[1]=>
string(3) "foo"
[2]=>
string(3) "bar"
[3]=>
string(3) "baz"
[4]=>
string(5) "blong"
}
string(43) "{"1":"foo","2":"bar","3":"baz","4":"blong"}"

删除一个连续数组值的方式产生的非连续数组
array(3) {
[0]=>
string(3) "foo"
[2]=>
string(3) "baz"
[3]=>
string(5) "blong"
}
string(33) "{"0":"foo","2":"baz","3":"blong"}"


$obj->Name= 'a1';$obj->Number ='123';
$obj->Contno= '000';
echo json_encode($obj);

结果为:

{"Name":"a1",
"Number":"123",
"Contno":"000"
}

可以看出json_encode()和json_decode()是编译和反编译过程,注意json只接受utf-8编码的字符,所以json_encode()的参数必须是utf-8编码,否则会得到空字符或者null


如果是中文的话就要注意了

在网上找到一种解决方法:

 代码如下 复制代码

<?php
/* 处理json_encode中文乱码 */
$data = array ('game' => '冰火国度', 'name' => '刺之灵', 'country' => '冰霜国', 'level' => 45 );
echo json_encode ( $data );
echo "<br>";
$newData = array ();
foreach ( $data as $key => $value ) {
$newData [$key] = urlencode ( $value );
}
echo urldecode ( json_encode ( $newData ) );
?>

后来请教了别人,还可以用base64编码,不过base64编码不可以放在URL中,百度是这样解释的:

标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准Base64中的“/”和“+”字符变为形如“%XX”的形式,而这些“%”号在存入数据库时还需要再进行转换,因为ANSI SQL中已将“%”号用作通配符。

不过我的数据是要通过POST发送的,并不在HTTP 的head中,而在message-body里,所以不受影响。

json_encode 只能接受utf-8格式的数据


例如:'胥'经过json_encode处理后变为'u80e5',最终的json中中文部分被替换为unicode编码。我们要解决的就是将对象转换为json并保证对象内部的中文在json中仍然是以正常的中文出现,现在看来只使用json_encode是不能达到目的的。
  我的解决方法:先将类中的中文字段进行url编码(urlencode),然后再对对象进行json编码(jsonencode),最后url解码(urldecode)json,即最终的json,里面的中文依旧是那个中文!
测试代码如下:

 代码如下 复制代码

<?php
class myClass {
public $item1 = 1;
public $item2 = '中文';
function to_json() {
//url编码,避免json_encode将中文转为unicode
$this->item2 = urlencode($this->item2);
$str_json = json_encode($this);
//url解码,转完json后将各属性返回,确保对象属性不变
$this->item2 = urldecode($this->item2);
return urldecode($str_json);
}
}
$c = new myClass();
echo json_encode($c);
echo '<br/>';
echo $c->to_json();
echo '<br/>';
echo json_encode($c);
echo '<br/>';
echo json_encode('胥');
?>

程序输出结果:

{"item1":1,"item2":"u4e2du6587"}
{"item1":1,"item2":"中文"}
{"item1":1,"item2":"u4e2du6587"}
"u80e5"


 

[!--infotagslink--]

相关文章

  • C#中截取字符串的的基本方法详解

    这篇文章主要介绍了C#中截取字符串的的基本方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-03
  • c#中判断字符串是不是数字或字母的方法

    这篇文章介绍了C#判断字符串是否数字或字母的实例,有需要的朋友可以参考一下...2020-06-25
  • PostgreSQL判断字符串是否包含目标字符串的多种方法

    这篇文章主要介绍了PostgreSQL判断字符串是否包含目标字符串的多种方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-02-23
  • 详解C++ string常用截取字符串方法

    这篇文章主要介绍了C++ string常用截取字符串方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
  • php字符串按照单词逐个进行反转的方法

    本文实例讲述了php字符串按照单词进行反转的方法。分享给大家供大家参考。具体分析如下:下面的php代码可以将字符串按照单词进行反转输出,实际上是现将字符串按照空格分隔到数组,然后对数组进行反转输出。...2015-03-15
  • 运行vbs脚本报错无效字符、中文乱码的解决方法(编码问题)

    今天在写一个vbs的时候,发现中文乱码,后来写好代码正常运行的代码压缩一下给了同事,发现报无效字符,经过验证后发现原来是编码的问题导致,这里就为大家分享一下...2020-06-30
  • phpStudy访问速度慢和启动失败的解决办法

    下面给大家介绍phpstudy访问速度慢的解决办法。1、修改mysql数据库链接地址为ip地址127.0.0.1。2、使用最新版本,这个坑了我好久时间。下面一段内容是关于phpstudy启动失败的解决办法。php5.3、5.4和apache都是用vc9编...2015-11-24
  • 使用list stream: 任意对象List拼接字符串

    这篇文章主要介绍了使用list stream:任意对象List拼接字符串操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-09
  • MySQL 字符串拆分操作(含分隔符的字符串截取)

    这篇文章主要介绍了MySQL 字符串拆分操作(含分隔符的字符串截取),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-22
  • C# 16 进制字符串转 int的方法

    这篇文章主要介绍了C# 16 进制字符串转 int的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • 获取中文字符串的实际长度代码

    JS中默认中文字符长度和其它字符长度计算方法是一样的,但某些情况下我们需要获取中文字符串的实际长度,代码如下: 复制代码 代码如下: function strLength(str) { var realLength = 0, len = str.length, charCode = -1;...2014-06-07
  • C#实现字符串转换成字节数组的简单实现方法

    这篇文章主要介绍了C#实现字符串转换成字节数组的简单实现方法,仅一行代码即可搞定,非常简单实用,需要的朋友可以参考下...2020-06-25
  • php 中英文混合字符串截取

    文章介绍一个实用的函数,我们如果用php substr来截取字符在中文上处理的很有问题,今天自己写了一个比较好的中文与英文字符截取的函数,有需要的朋友可以参考下。 ...2016-11-25
  • C#实现对字符串进行大小写切换的方法

    这篇文章主要介绍了C#实现对字符串进行大小写切换的方法,涉及C#操作字符串的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • PostgreSQL 字符串处理与日期处理操作

    这篇文章主要介绍了PostgreSQL 字符串处理与日期处理操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-01
  • c#将字节数组转成易读的字符串的实现

    这篇文章主要介绍了c#将字节数组转成易读的字符串的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
  • Jrebel启动失败解决方案详解

    这篇文章主要介绍了Jrebel启动失败解决方案详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-07-07
  • C#获取字符串后几位数的方法

    这篇文章主要介绍了C#获取字符串后几位数的方法,实例分析了C#操作字符串的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • 解决vue字符串换行问题(绝对管用)

    这篇文章主要介绍了解决vue字符串换行问题(绝对管用),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-06
  • C#判断一个字符串是否是数字或者含有某个数字的方法

    这篇文章主要介绍了C#判断一个字符串是否是数字或者含有某个数字的方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下...2020-06-25