仓酷云

标题: PHP网站制作之PHP教程:preg_replace_callback()函数 [打印本页]

作者: 蒙在股里    时间: 2015-2-3 23:44
标题: PHP网站制作之PHP教程:preg_replace_callback()函数
我是根据自己的成长历程来写的,如有不对的还请指正。   </p> 比来碰着一个成绩,要在一段HTML代码的链接中加一个参数,好比个中由一个A标签是如许的:
  1. 1
复制代码
  1. <a href="http://www.example.com/aaa.php">链接文字</a>
复制代码
我就要在 aaa.php 的前面加上一个参数使其酿成 aaa.php?request=xxx ,但成绩是否是一切的链接都是aaa.php如许的模式,能够前面已有了其余参数,好比 aaa.php?id=111 ,如许加的时分就需求把链接酿成 aaa.php?id=111&request=xxx 。
因为要处置的是一大块HTML,所以起首想到的处理计划是正则交换,不外 preg_replace 不克不及做前提判别,只能做一种交换,然后我就找到了 preg_replace_callback() 这个函数,大喜,觉得找到了银弹。这个器材的用法和 preg_replace() 函数几近一样,不外它供应了一个 callback 函数,可以在交换的时分依据前提交换。在PHP手册中供应了这么一个例子:
  1. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
复制代码
  1. <?php // 此文本是用于 2002 年的, // 如今
    想使其能用于 2003 年 $text = "April fools day is 04/01/2002\n"; $text.= "Last christmas was 12/24/2001\n";   // 回调函数 function next_year($matches) { // 凡是
    :$matches[0] 是完全
    的婚配
    项 // $matches[1] 是第一个括号中的子形式
    的婚配
    项 // 以此类推 return $matches[1].($matches[2]+1); }   echo preg_replace_callback( "(\d{2}/\d{2}/)(\d{4})", "next_year", $text);   // 了局
    为: // April fools day is 04/01/2003 // Last christmas was 12/24/2002 ?>
复制代码
看了这个例子以后我觉得只需把想要交换的内容交换失落就OK了,好比我只想更改捕捉的第二个婚配项,只需求把 $matches[2]中的内容改一下前往就好了。然后我就写了上面的代码测试:
  1. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
复制代码
  1. $content = '<a href="http://www.example.com/aaa.php">链接1</a><a href="http://www.example.com/aaa.php?id=111">链接2</a>';   $content = preg_replace_callback('/href=[\'"](.*?)[\'"]/', 'add_request', $content);   // 上面
    是 add_request 函数界说
       function add_source($matches) { if(strpos($matches[1], '?')) { return $matches[1].'&request=xxx'; } else { return $matches[1].'?request=xxx'; } }
复制代码
不外实行以后却发明把代码交换得七零八落,我找了半天都没发明哪里失足了。后来细心反省了一下才豁然开朗,我被手册上的例子误导了!!其实这个函数会交换婚配的全部内容,即 /href=[\'"](.*?)[\'"]/ (包含 href),而不只是 (.*?) 所捕捉的器材。而手册例子中的正则是如许的:(\d{2}/\d{2}/)(\d{4}) ,它的一切局部都是在()内的,所以交换成 $matches[1].($matches[2]+1) 天然不会有成绩,然而它却让我误觉得这个函数会有针对性地交换 $matches[1] 和 $matches[2]中的内容,现实上它仍是交换全部正则婚配的内容,即 $matches[0]中的内容,而加上的括号只是为了咱们对字符串操作便利罢了!懂得这一点以后,修正了代码:
  1. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
复制代码
  1. $content = '<a href="http://www.example.com/aaa.php">链接1</a><a href="http://www.example.com/aaa.php?id=111">链接2</a>';   $content = preg_replace_callback('/href=[\'"](.*?)[\'"]/', 'add_request', $content);   // 上面
    是 add_request 函数界说
       function add_source($matches) { if(strpos($matches[1], '?')) { return 'href="'.$matches[1].'&request=xxx"'; //注重
    ,这里和上面
    都加上了正则里括号外的器材
    :href=" } else { return 'href="'.$matches[1].'?request=xxx"'; } }
复制代码
改好以后,测试正常。
一点进修笔记,纪录在此。
PHP成功的插入,删除,更新数据的时候,显然,你已经距离成功指日可待了。
作者: 仓酷云    时间: 2015-2-4 06:24
先学习php和mysql,还有css(html语言很简单)我认为现在的效果比以前的方法好。
作者: 透明    时间: 2015-2-9 17:31
首推的搜索引擎当然是Google大神,其次我比较喜欢 百度知道。不过搜出来的结果往往都是 大家copy来copy去的,运气的的概率很大。
作者: 精灵巫婆    时间: 2015-2-26 22:18
曾经犯过一个很低级的错误,我在文件命名的时候用了一个横线\\\\\\\'-\\\\\\\' 号,结果找了好几个小时的错误,事实是命名的时候 是不能用横线 \\\\\\\'-\\\\\\\' 的,应该用的是下划线  \\\\\\\'_\\\\\\\' ;
作者: 乐观    时间: 2015-3-4 03:29
其实也不算什么什么心得,在各位大侠算是小巫见大巫了吧,望大家不要见笑,若其中有错误的地方请各位大虾斧正。
作者: 老尸    时间: 2015-3-6 08:08
兴趣是最好的老师,百度是最好的词典。
作者: 山那边是海    时间: 2015-3-7 02:06
本人接触php时间不长,算是phper中的小菜鸟一只吧。由于刚开始学的时候没有名师指,碰过不少疙瘩,呗很多小问题卡过很久,白白浪费不少宝贵的时间,在次分享一些子的学习的心得。
作者: 谁可相欹    时间: 2015-3-10 22:00
其实没啥难的,多练习,练习写程序,真正的实践比看100遍都有用。不过要熟悉引擎
作者: 小女巫    时间: 2015-3-11 19:07
Apache不是非得用80或者8080端口的,我刚开始安得时候就是80端口老占用,就用了个 81端口,结果照常,就是输localhost的时候,应该输入为 localhost:81
作者: 再现理想    时间: 2015-3-15 23:15
php是动态网站开发的优秀语言,在学习的时候万万不能冒进。在系统的学习前,我认为不应该只是追求实现某种效果,因为即使你复制他人的代码调试成功,实现了你所期望的效果,你也不了解其中的原理。
作者: 活着的死人    时间: 2015-3-16 23:53
装在C盘下面可以利用windows的ghost功能可以还原回来(顺便当做是重转啦),当然啦我的编译目录要放在别的盘下,不然自己的劳动成果就悲剧啦。
作者: 分手快乐    时间: 2015-3-17 10:32
不禁又想起那些说php是草根语言的人,为什么认得差距这么大呢。
作者: 不帅    时间: 2015-3-20 13:26
我还是强烈建议自己搭建php环境。因为在搭建的过程中你会遇到一些问题,通过搜索或是看php手册解决问题后,你会更加深刻的理解它们的工作原理,了解到php配置文件中的一些选项设置。
作者: 飘灵儿    时间: 2015-3-31 23:13
当然这种网站的会员费就几十块钱。
作者: 爱飞    时间: 2015-4-3 05:16
学习php的目的往往是为了开发动态网站,phper就业的要求也涵盖了很多。我大致总结为:精通php和mysql
作者: 小妖女    时间: 2015-4-14 12:59
写js我最烦的就是 ie 和 firefox下同样的代码 结果显示的结果千差万别,还是就是最好不要用遨游去调试,因为有时候遨游是禁用js的,有可能代码是争取结果被遨游折腾的认为是代码写错。
作者: 深爱那片海    时间: 2015-4-21 23:11
有位前辈曾经跟我说过,phper 至少要掌握200个函数 编起程序来才能顺畅点,那些不熟悉的函数记不住也要一拿手册就能找到。所以建议新手们没事就看看php的手册(至少array函数和string函数是要记牢的)。
作者: 金色的骷髅    时间: 2015-5-1 01:12
当然这种网站的会员费就几十块钱。
作者: 再见西城    时间: 2015-5-1 19:10
php是动态网站开发的优秀语言,在学习的时候万万不能冒进。在系统的学习前,我认为不应该只是追求实现某种效果,因为即使你复制他人的代码调试成功,实现了你所期望的效果,你也不了解其中的原理。
作者: 飘飘悠悠    时间: 2015-5-6 11:10
在我安装pear包的时候老是提示,缺少某某文件,才发现 那群extension 的排列是应该有一点的顺序,而我安装的版本的排序不是正常的排序。没办法我只好把那群冒号加了上去,只留下我需要使用的扩展。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2