|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
我是根据自己的成长历程来写的,如有不对的还请指正。 </p> 比来碰着一个成绩,要在一段HTML代码的链接中加一个参数,好比个中由一个A标签是如许的:
- <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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
复制代码- <?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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
复制代码- $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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
复制代码- $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成功的插入,删除,更新数据的时候,显然,你已经距离成功指日可待了。 |
|