仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 653|回复: 19
打印 上一主题 下一主题

[学习教程] PHP网站制作之PHP教程:preg_replace_callback()函数

[复制链接]
蒙在股里 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-2-3 23:44:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
我是根据自己的成长历程来写的,如有不对的还请指正。   </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:37 | 只看该作者
先学习php和mysql,还有css(html语言很简单)我认为现在的效果比以前的方法好。
透明 该用户已被删除
板凳
发表于 2015-2-9 17:31:09 | 只看该作者
首推的搜索引擎当然是Google大神,其次我比较喜欢 百度知道。不过搜出来的结果往往都是 大家copy来copy去的,运气的的概率很大。
精灵巫婆 该用户已被删除
地板
发表于 2015-2-26 22:18:23 | 只看该作者
曾经犯过一个很低级的错误,我在文件命名的时候用了一个横线\\\\\\\'-\\\\\\\' 号,结果找了好几个小时的错误,事实是命名的时候 是不能用横线 \\\\\\\'-\\\\\\\' 的,应该用的是下划线  \\\\\\\'_\\\\\\\' ;
乐观 该用户已被删除
5#
发表于 2015-3-4 03:29:01 | 只看该作者
其实也不算什么什么心得,在各位大侠算是小巫见大巫了吧,望大家不要见笑,若其中有错误的地方请各位大虾斧正。
老尸 该用户已被删除
6#
发表于 2015-3-6 08:08:31 | 只看该作者
兴趣是最好的老师,百度是最好的词典。
山那边是海 该用户已被删除
7#
发表于 2015-3-7 02:06:12 | 只看该作者
本人接触php时间不长,算是phper中的小菜鸟一只吧。由于刚开始学的时候没有名师指,碰过不少疙瘩,呗很多小问题卡过很久,白白浪费不少宝贵的时间,在次分享一些子的学习的心得。
谁可相欹 该用户已被删除
8#
发表于 2015-3-10 22:00:33 | 只看该作者
其实没啥难的,多练习,练习写程序,真正的实践比看100遍都有用。不过要熟悉引擎
小女巫 该用户已被删除
9#
发表于 2015-3-11 19:07:05 | 只看该作者
Apache不是非得用80或者8080端口的,我刚开始安得时候就是80端口老占用,就用了个 81端口,结果照常,就是输localhost的时候,应该输入为 localhost:81
再现理想 该用户已被删除
10#
发表于 2015-3-15 23:15:05 | 只看该作者
php是动态网站开发的优秀语言,在学习的时候万万不能冒进。在系统的学习前,我认为不应该只是追求实现某种效果,因为即使你复制他人的代码调试成功,实现了你所期望的效果,你也不了解其中的原理。
活着的死人 该用户已被删除
11#
发表于 2015-3-16 23:53:26 | 只看该作者
装在C盘下面可以利用windows的ghost功能可以还原回来(顺便当做是重转啦),当然啦我的编译目录要放在别的盘下,不然自己的劳动成果就悲剧啦。
分手快乐 该用户已被删除
12#
发表于 2015-3-17 10:32:20 | 只看该作者
不禁又想起那些说php是草根语言的人,为什么认得差距这么大呢。
不帅 该用户已被删除
13#
发表于 2015-3-20 13:26:32 | 只看该作者
我还是强烈建议自己搭建php环境。因为在搭建的过程中你会遇到一些问题,通过搜索或是看php手册解决问题后,你会更加深刻的理解它们的工作原理,了解到php配置文件中的一些选项设置。
飘灵儿 该用户已被删除
14#
发表于 2015-3-31 23:13:32 | 只看该作者
当然这种网站的会员费就几十块钱。
爱飞 该用户已被删除
15#
发表于 2015-4-3 05:16:38 | 只看该作者
学习php的目的往往是为了开发动态网站,phper就业的要求也涵盖了很多。我大致总结为:精通php和mysql
小妖女 该用户已被删除
16#
发表于 2015-4-14 12:59:11 | 只看该作者
写js我最烦的就是 ie 和 firefox下同样的代码 结果显示的结果千差万别,还是就是最好不要用遨游去调试,因为有时候遨游是禁用js的,有可能代码是争取结果被遨游折腾的认为是代码写错。
深爱那片海 该用户已被删除
17#
发表于 2015-4-21 23:11:50 | 只看该作者
有位前辈曾经跟我说过,phper 至少要掌握200个函数 编起程序来才能顺畅点,那些不熟悉的函数记不住也要一拿手册就能找到。所以建议新手们没事就看看php的手册(至少array函数和string函数是要记牢的)。
金色的骷髅 该用户已被删除
18#
发表于 2015-5-1 01:12:27 | 只看该作者
当然这种网站的会员费就几十块钱。
再见西城 该用户已被删除
19#
发表于 2015-5-1 19:10:15 | 只看该作者
php是动态网站开发的优秀语言,在学习的时候万万不能冒进。在系统的学习前,我认为不应该只是追求实现某种效果,因为即使你复制他人的代码调试成功,实现了你所期望的效果,你也不了解其中的原理。
飘飘悠悠 该用户已被删除
20#
发表于 2015-5-6 11:10:36 | 只看该作者
在我安装pear包的时候老是提示,缺少某某文件,才发现 那群extension 的排列是应该有一点的顺序,而我安装的版本的排序不是正常的排序。没办法我只好把那群冒号加了上去,只留下我需要使用的扩展。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-9-21 21:53

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表