preg_replace_callback如何增加和替换?

时间:2014-02-07 14:21:07

标签: php preg-replace-callback

我一直试图了解preg_replace_callback是如何工作的,但我只是不明白。

比方说,我是来自navigation.php的get_contents。 其中有一堆href和div,我希望在每个href之前给出增量id并添加一些代码注释。 我将如何遍历所有这些以便它们都会增加并添加ID和注释?

<?php
$string = file_get_contents("navigation.php");
$i = 1;
$replace = "<a ";
$with = '<!-- UNIT'.$i.' --><a id=a_'.$i;
$replace2 = "<div ";
$with2 = '<div id=b_'.$i;
preg_replace_callback()
$i++

?>

我想也许如果我能用我的代码得到一个例子,也许我能够更好地理解它

所以$ replace和$ replace2是我正在搜索的字符串 $ with和$ with2分别是替换,$ i是增量

以数据为例

<a href="page4.php">Page 4</a>
<a href="page3.php">Page 3</a>
<div class="red">stuff</div>
<div class="blue">stuff</div>

我想要输出像..

<!-- UNIT 1 --><a id="a_1" href="page4.php">Page 4</a>
<!-- UNIT 2 --><a id="a_2" href="page3.php">Page 3</a>
<div id="b_1" class="red">stuff</div>
<div id="b_2" class="blue">stuff</div>

1 个答案:

答案 0 :(得分:0)

你有多个目标,实现它们的最简单方法是逐步完成它。

<强> 1。 RegEx

您需要两个HTML标记,这些标记可以通过/(<a|<div)/i轻松捕获(explanationg修饰符仅用于证明它正确匹配。)

有了这个,您可以编写以下代码:

$parsed = preg_replace_callback('/(<a|<div)/i', ???, $string);

<强> 2。回调

这背后的逻辑可以简化为以下开关

switch ($found) {
    case '<div':
        $result = '<div id="b_'.$id.'"';
        break;
    case '<a':
        $result = '<!-- UNIT'.$id.' --><a id="a_'.$id.'"';
        break;
    default:
        $result = "";
        break;
}

要实现此功能,您可以编写新功能或使用匿名功能。要使$id可访问,您需要了解variable scope in PHP。使用global $id;define()之类的任何内容的简单方法是使用Closures语法use()。为了能够操纵$id(递增它),您需要pass it by reference(使用闭包时)。这将带您进入以下代码:

$parsed = preg_replace_callback("/(<a|<div)/", function($match) use (&$id) {
    switch ($match[1]) {
        case '<div':
            $result = '<div id="b_'.$id.'"';
            break;
        case '<a':
            $result = '<!-- UNIT'.$id.' --><a id="a_'.$id.'"';
            break;
        default:
            $result = $match[1];//do nothing
            break;
    }
    $id++;

    return $result;
}, $string);

注意它的工作here