快速业务通道

PHP教程:preg_replace_callback()函数

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-03-16

最近碰到一个问题,要在一段HTML代码的链接中加一个参数,比如其中由一个A标签是这样的:

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
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'';
    }
}

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号