多数大学生出来选择的工作和专业无关
首页 > 专业知识

php中一些常用的字符处理函数

时间:2018-04-03 18:19:30 [来源]:郑州PHP培训学校

   php中一些常用的字符处理函数

  地狱中仰望天堂2012-07-4我爱PHP浏览:1219无评论
  到目前为止我其实还是算是一个php新手,这是我系统学习的第一个编程语言,其实所有的编程语言都是有共通之处的,就我的理解而言,所有的操作其实都是对字符的操作,我们通过判断字符的有无或者字符的具体的值是多少,进而来确定执行什么操作,而这所谓的操作其实也是对字符的操作,要么读取,要么添加,要么修改,要么删除。而程序的基本就是循环和分支。
  所有的功能的操作都不会只有一种方法,都会有很多方法达到目的,但是当我们已经可以达到目的的时候就不能只单单的停留在功能的实现上,就应该考虑优化,就应该考虑如何更高效的完成任务达到目的。而这些函数对于我们这些苦命的phper而言,就应了那一句话“文章本天成,妙手偶得之!”。
  其实所有的功能的实现都是可行的,也就是说我们的需求,我们想要实现的功能都是可以实现和做到的,方法已经在那里了,就等着我们去发现。要相信程序可以实现任何功能。只是有优劣之分罢了。下面就具体的说几个常用而又好用的字符处理函数。
  1、 str_ireplace函数
  字符替换函数,其实正则函数也有替换函数,但是,能用函数直接实现的最好还是用php自带的函数。而如果字符比较复杂,再使用正则。正则其实也非常的简单。
  他虽然叫替换函数,但是,我们其实可以转变一下思路,他完全可以用来将某些字符清空。
  例str_ireplace(‘<’,”,$content);就是将<清空。这样的应用很广。我在我的博客《织梦获取最新文章和连接的接口》中就有提到了这个应用。str_replace函数和他一样,只是前个函数对大小写不敏感,这个对大小写敏感。
  2、 explode函数
  explode(以什么分割,要分割的字符);这是个使用频率很高的函数,和他对应的就是implode()函数,implode链接函数,implode (“以什么连接“,要连接的数组)=join函数。这两个函数结合使用可以取得很大的功效。很多时候,有的人在用“,”链接字符串的时候,用循环。其实,那样的话会在后面或前面多出一个“,”,而用implode函数就不会。这样可以应用于批量处理,比如一个多选框。提交后是数组的形式,我们要批量的删除,可以用implode用“,”来链接,然后在sql语句中使用where in($arry)来实现。
  3、 strstr(a,b) 和strrchr(a,b)函数。
  前一个是获取a在b第一次出现位置后的所有字符,后一个是获取a在b最后一次出现位置后的所有字符。后一个有一个非常好的妙用。那就是我们应该都有做过文件上传功能。在做这个功能的时候一定会遇到的就是获得文件的后缀,以前我们学习的时候是获取文件名后,用前面的explode函数分割,然后取第二个参数。但是,这样有个问题,就是如果文件的名字为xx.xx.jpg这样就会出错误了,当然我们可以获得数组的最后一个参数,但是这样也不好,太麻烦,而用strrchr(‘.’,文件名)这样就可以获得.后缀名,我觉得还是比较方便的。
  4、 htmlentities函数
  这个函数可能有很多人并没有使用过,但是这却是个非常有用很强大的一个函数。我们都知道php有防止sql注入的函数addslashes,其实他的作用也类似。我们都知道如果我们echo ‘<div></div>’;我们是无法看到的,但是查看下源码是能看到的,这就是因为输出的是html的关键字,被转译了。而有的时候,我们是需要是输出这些标签的,不单单是发类似的这种技术类的文章,还有就是有的时候我们使用一些接口类的程序,我们想对返回的值进行一些操作,但是返回的值都是html的关键字。我们看不到,就无从下手了,这时候,我们就可以用到这个函数来做调试。
  5、urlencode函数
  urlencode($filename);//转码,将中文转换成%数,将空格转换为+。空格为%20。这是一个转码函数,很多时候,我们都会因为中文字符的编码而头疼,总是会有乱码,尤其是我们在使用ajax的时候,会发现,有的时候ajax传递的中文经常出现乱码,要想编码统一,其实有四个地方需要注意,第一个是文件本身的格式,这个是很多人会忽略掉的,用editplus打开文件,会看到右下角,有个文件本身的编码默认的是ANSI,而如果你要使用utf8就需要文件另存,保存为utf8,还有就是html中的charset=utf-8″,然后是数据库连接函数中mysql_query(“SET character_set_connection=utf8, character_set_results=utf8, character_set_client=binary”,$con);最后一步就是数据库存储字段用到的编码格式,要使用utf8这样才能编码统一。而用这个函数就可以转换为数字和英文,这样不容易出现编码问题,当然接受的时候需要用UrlEncode来进行反转码。
  6、写入文件函数
  很多人不知道给文件写入数据的时候如何写入换行,我们以fwrite($file, “\r\n”);为例,如果将双引号改为单引号就不能写入换行,为什么,这就是php的一个机制,php会解析双引号里面的东西,而会将单引号的内容原样使用。所以,在不需要操作内部的数据的时候用单引号要快一些。既然提到了文件函数,这里说个file(file) 将文件每行付给一个数组,file_get_content(file) 将文件内容付给一个字符。这两个是有很大不同的。明白他们的不同可以有很大的用处。
  7、pathinfo() 函数以数组的形式返回文件路径的信息。
  <?php
  print_r(pathinfo(“/testweb/test.txt”));
  ?>
  输出:
  Array
  (
  [dirname] => /testweb
  [basename] => test.txt
  [extension] => txt
  )
  8、array_pop — 将数组最后一个单元弹出(出栈)就是将该元素从数组中去掉付给一个变量
  9  ucwords(string)将字符串的首字符转换成大写
  ucwords(‘abc df’); //Abc Df
  ucfirst(‘abc df’); //Abc df
  看出不同了吗。
  10 echo number_format(’1234567890.4545′,2,’.',’,'); //1,234,567,890.45
 
  PHP最主要的7个安全漏洞
  对于快速发展的动态网页而言,PHP是一种了不起的语言。PHP也具有对初级程序员友好的特点,比如PHP就不需要动态声明。然而,这些特征可能导致一个程序员无意地让安全漏洞潜入到web应用程序中。在PHP应用中,流行的安全邮件列表就出现大量被证实的漏洞,但是一旦你明白PHP应用程序中常见的几种漏洞的基本类型,那你将发现它和其他语言是同样安全的。
  在这篇文章中,我将详细地介绍会导致安全漏洞的几种常用见的PHP程序缺陷。通过向你们展示什么是不能做的,并且如何利用每个特定的缺陷,我希望你们不仅仅能明白怎样避免这些特定的缺陷,而且为什么这些错误能导致安全漏洞。
  明白每个可能出现的缺陷,将帮助你们避免在PHP应用程序中产生同样的错误。
  安全是一个过程,不是一个产品在应用程序开发过程中采用对安全有益的方法可以让你生成更紧密,更健壮的代码。
  未校验输入缺陷
  如果不是最常见的PHP安全漏洞,也是其中之一的,就是未校验输入错误。提供数据的用户是根本不能信任的。你应该假定你的web应用程序的用户个个都是心怀叵测的,因为他们中的一些就是那样的。未校验或不正确验证输入是被一些漏洞所利用的根源,我们将在本文后面进行讨论。
  例如,你可能写一个允许用户查看日历的如下代码,通过调用UNIX的cal命令来显示指定月份。
  $month = $_GET['month'];
  $year = $_GET['year'];
  exec("cal $month $year", $result);
  print "
  ";
  foreach ($result as $r) { print "$r"; }
  print "";
  此代码具有一个安全漏洞缝隙,因为没有以任何的方式来验证$_GET[month]和$_GET[year]变量。只要那个特定的月份是在1到12之间,并且提供一个合适的四位数年份,那这个应用程序将完美运行。然而,恶意用户可能追加“; ls - la”到年参数,从而看到您网站的HTML目录列表。一个极端恶劣的用户可能追加";rm -rf *"到年参数,且删除整个网站!
  纠正这种错误的合适的方法就是确保你从用户接受的输入是你期望得到的。不用为这种错误使用JavaScript验证,创造他们自己形式javascript或是禁用javascript的开发者是很容易处理如此的验证方法的。为确保输入月份和年份是数字,且只有数字,你需要添加PHP代码,如下所示。
  $month = $_GET['month'];
  $year = $_GET['year'];
  if (!preg_match("/^[0-9]{1,2}$/", $month)) die("Bad month, please re-enter.");if (!preg_match("/^[0-9]{4}$/", $year)) die("Bad year, please re-enter.");exec("cal $month $year", $result);
  print "
  ";
  foreach ($result as $r) { print "$r"; }
  print "";
  不用担心用户提供影响你应用程序的输入或是运行输入的服务器,你能安全地使用代码。正则表达式是一个很棒的验证输入的工具。尽管难以掌握它,但在这种情况下是非常有用的。
  你应该总是通过拒绝与你期望数据不相符合的数据,来验证你的用户提供的数据。永远都不要使用在你知道期望数据是有害的情况下仍然接受此数据的方法,此方法是安全漏洞的共同来源。有时,恶意的用户能避开此种方法,例如,用空字符来掩盖坏输入的方法。如此的输入将通过检查,但是它仍然具有坏的影响。
  当你验证任何输入时,你应当尽可能的严格。如果有一些没必要包含的字符,可能的话,你应该要么去除那些无用的字符,要么完全拒绝输入。
  访问控制缺陷
  另一个缺陷,不一定限于PHP应用程序,但仍然是重要的,是访问控制的脆弱性类型。当你的应用程序的某些部分的应用是限定于某些用户的时候,这种缺陷就出现了,如,一个允许更改配置设置或显示敏感信息的管理页面。
  你应该检查每个你的PHP应用程序页面限制加载的用户的访问权利。如果你仅仅只检查在索引页面的用户证书,那么一个恶意的用户能直接进入一个“更深层”网页的链接,这将跳过证书检查的过程。
  如,如果你的网站有攻击用户的可预测IP或固定IP地址,则可以通过限制用户访问该用户的基本IP地址和他们用户的名字在你程序的安全层上是有利的。放置你的受限制的网页在一个由apache.htaccess文件保护的独立的目录里也是一个好的做法。
  将配置文件放置在你web访问目录的外面。一个配置文件包含数据库密码和其他一些能被恶意用户用来渗透或者破坏你站点的信息;从来不让远程用户访问这些文件。使用PHP的include函数来包含这些来自不可web访问的目录的文件,万一这个目录曾因管理员误操作而产生web访问,这可能包括含有“否定一切”的an.htaccess文件。尽管分层安全是多余的,但是它是一件积极的事情。
  对于我的PHP应用程序,我更喜欢基于一下样本的目录结构。所有的功能库,类和配置文件存储在includes目录里。这些include文件总是以a.php扩展名命名,因此即便是跳过所有你的保护,web服务器将解析PHP代码,且不会将它显示给用户。www和管理目录是唯一的目录,它们的文件由一个URL直接被访问,管理目录由an.htaccess文件所保护,这个文件只允许知道用户名和密码的用户进入,且这些密码存储在站点根目录中的.htpasswd文件里。
  /home
  /httpd
  /www.example.com
  .htpasswd
  /includes
  cart.class.php
  config.php
  /logs
  access_log
  error_log
  /www
  index.php
  /admin
  .htaccess
  index.php
  你应该设置你的Apache目录索引到“index.php”,并且在每个目录中保持一个index.php文件。如果不能浏览目录,如一个图片目录或是相似的目录,则设置Apache目录来重定向你的主页。永远都不要通过增加.bak或其他扩展到文件名复制一个php文件在你的公开的web目录里。根据你使用的web服务器(Apache幸而似乎对此服务器有一定保障),此服务器不会解析文件中的PHP代码,可能作为资源输出给碰巧得到拷贝文件URL的用户。如果那个文件包含密码或是其他隐秘信息,此文件将是可读的,如果碰巧给黑客发现,那此文件可能甚至不被Google索引。将文件重命名为a.bak.php的扩展比套接a.bak到.php扩展要更安全,但是最好的解决方法是使用一个源代码版本控制系统比如CVS。尽管CVS学起来很难,但是你花费的时间将在许多方面得到补偿。该系统节省你项目中的每个文件的每个版本,当此后要改变导致的问题时,它能具有无法估量的价值。
  会话ID保护
  拦截会话ID是PHP网站的一个问题。PHP会话跟踪组建为每一个用户会话使用唯一的ID,但是如果其他用户知道了这个ID,此用户能拦截这个ID的用户会话并能看到秘密信息。拦截会话ID是完全不能被阻止的,你应该知道一些风险以便减轻他们。
  例如,甚至在给用户验证和分配了一个会话ID后,当他或是她进行任何高度敏感行为时,如重设密码哦,你都应该重新验证该用户。如,绝不允许一个会话验证的用户没有进入旧的密码就能进入一个新的密码。你也应该避免呈现真正的秘密数据给只被会话ID验证的用户,如信用卡号。
  应该使用session_regenerate_id函数为通过登陆创建新会话的用户安排一个新的会话ID。一个拦截用户将试图用他之前的会话ID登陆,如果在登陆时设置你的ID,就会阻止此事情的发生。
  如果你的站点正处理很重要的信息,如信用卡,必须一直使用一个SSL安全连接。由于不能发现会话ID且不容易拦截它,这将减少会话拦截的漏洞。如果你的网站运行在共享的Web服务器上,要知道,在同一服务器上的任何其他用户都很容易地查看任何会话变量。通过在数据库记录中存储所有的敏感数据来减轻这个漏洞,此数据库记录关键在于会话ID而不是作为会话变量。如果你必须在会话变量中存储密码(我再次强调,避免出现这种情况是最好的),不要在明文中存储密码;使用sha1() (PHP 4.3+) or md5()函数来存储密码的哈希值来代替。
  if ($_SESSION['password'] == $userpass) {// do sensitive things here
  }
  以上代码是不安全的,因为密码存储在会话变量的明文中。相反,更可能像这样使用代码:
  if ($_SESSION['sha1password'] == sha1($userpass)) {// do sensitive things here
  }
  SHA-1算法并不是没有缺陷,计算机能力的发展使得它有可能产生碰撞(同一SHA-1总数具有不同字符串)。然而此技术存储密码仍然大大优于在明文中存储密码。如果你必须使用MD5,因为这优于明文中存储密码,但是请记住,近来的发展已经使它在标准的PC硬件上可能不到一小时就产生MD5碰撞。理想情况下,应该使用一个函数来实现SHA-256,如此的函数在当前是与PHP相独立的。
  为了进一步了解哈希碰撞,在其他一些与安全相关的主题中,Bruce Schneier's Website是最好的资源。
  跨站点脚本(XSS)缺陷
  跨站点脚本或XSS缺陷是用户验证的子集,一个恶意的用户在被呈现的且被其他用户执行的数据里嵌入脚本命令—通常是JavaScript。
  例如,如果你的应用程序包含一个论坛,在此论坛里,人们发出的消息能被其他用户看到,恶意用户可以嵌入一个为了阻止这类攻击的出现,你必须在网页中小心地显示用户提交的字面内容。防范这最容易的方法就是只要避免组成HTML语法的字符(特别是<和>)到HTML字符实体(<和>),以便为了显示将提交的数据作为明文看待。通过PHP的htmlspecialchars函数传递数据仅仅就像你正在输出一样。
  如果你的应用程序要求你的用户可以提交HTML内容,并将它当成这样,你反而会需要过滤出像.
 
  关于PHP语言的十大误解
  本文作者总结了人们对PHP的十大误解,并且进行澄清,有些误解值得深思,而有些又实在是捕风捉影。无论怎样,让我们一起来看下这些误解。
  1. PHP是一门面向对象语言,但不是基于OOPS
  这是完全不正确的理解,尤其是Java程序员,他们认为PHP不是基于OOPS;但他们会发现许多面向对象的特征,比如,接口、方法、抽象对象等。说实话,初始版的PHP没有太多的面向对象功能,但PHP 5添加很多面向对象技术。更重要的是,你也许会好奇,为什么Bootstrap代码在PHP里会变得那么简单,这个得归功于PHP与OO的结合。
  2. PHP无法实现特定的功能
  这个误解听起来比较模糊,但有许多开发者认为PHP不能实现内存访问等其他功能。但事实是,PHP是一门可扩展的语言,你只需用C或C++编写一个扩展,进行集成就OK了。或者,你无需创建,网上已经有成千上百个扩展可供使用,你可以根据需要,直接拿来使用。
  3. PHP不安全
  既然你认为它是不安全的,那为何不为它编写安全的代码呢。我承认,PHP里是有大量不安全的代码,但作为程序员,我们应该尽量编写可靠安全的代码。
  如果拿PHP与.NET进行比较,PHP肯定是失败的。但如果你是一个技术娴熟的程序员,你无需安全“帮助”。包括日常的安全问题,但如果他们的路径是动态生成的,那你就得当心了。当然,如果你精通所有的指令,它或许会变的更安全。
  4.不适合做大型应用程序
  一门语言之所以能用来构建大而复杂的应用,其自身要具有一定的可靠性和高性能,而可扩展的PHP并不符合。但是,如果你设计和开发的应用程序架构很稳定,那应用程序的性能和扩展又会有什么问题呢?
  事实是,一些知名的网站都是采用PHP设计的,比如Facebook、Wikipedia、和Yahoo!等,它们都能工作的很好。
  5.PHP只能用于网站开发
  的确,使用PHP进行网站开发是很普遍的。但命令行接口(CLI:Command Line Interface)可以让应用程序运行在非Web服务器上。
  虽然有些应用程序对CPU的要求很高,但通过执行PHP CLI,仍然可以采用PHP进行开发和运行。更重要的是,如果你想使用PHP开发桌面应用程序,只需使用Windows特定扩展即可搞定。
  6.开发过程缓慢
  对于这样的误解,我实在不知道是从哪里传出来的。有可能你编写的PHP代码很凌乱、并且里面充斥着大量的MySQL语句(它们虽然很有意义,但真不应该放在那里)。而事实上,PHP有大量的框架可供开发者使用,合理使用它们会达到事半功倍的效果,大大缩减开发时间。所以,不要抱怨慢。
  7.专业开发者不使用PHP
  关于这个误解,坊间有各种各样的说法,比如PHP对初学者是小菜一碟,它是为那些不想认真对待开发的人准备的等等。当然,不得不承认,PHP在某些方面的确没有什么意义,但是对于这样的误解,真的是可笑之至。如果这里有许多Web应用程序都是使用PHP开发,那么想象下,一向严谨的开发商却对PHP敬而远之,乃是完全错误的。
  8.性能问题
  这个是技巧问题,而不是误解。任何事情都有好有坏。性能优化也一直是开发者们争先讨论的话题。事实上,对于性能低下的应用,里面可能充斥着大量的垃圾代码,比如隐式转换、无用的模块、操作法缺乏重载等,这些都会影响到PHP应用程序的性能。但这最终要取决于你如何使用这门语言去创建一个稳定快速的应用程序。
  9.便宜的应用程序意味着质量不高
  在开源逐渐成为主流的市场环境下,免费、开源是PHP最大的优势。这意味着大多数拥有专业知识的开发人员都可以提供开发服务,并且还可以为客户节省成本。但这并不意味着质量就有问题,同样也可以开发出高性能的应用程序。
  10.PHP被高估了
  好吧,这或许只是你的个人想法,大部分的PHP程序员是不会这么想的。
  写在最后
  随着语言的不断发展和壮大,各种误解也会接踵而来,但无论如何,一些不实的谣言都会不攻而破。常言道,实践是检验真理的唯一标准,所以,在选择相信或不相信之前,最好亲自试验确认下。

上一篇:PHP中接收复选框信息的方法

下一篇:如何使用脚本来创建GUID?