在preg_replace_callback函数

时间:2019-08-13 17:19:08

标签: php arrays

我有简单的代码将数字中的链接替换为数字1,无论文本中的链接数量是多少。

echo preg_replace_callback('/regex/',
function ($links) {
    $reg = "/regex/i";
    preg_match($reg, $links[0], $url);
    static $count = 1;
    return '<a href="'. $url[0] .'" target="_blank" rel="noopener noreferrer">['. $count++ .']</a>';
}, $html);  

这正常。现在,如果多次在文本中使用相同的链接,我想添加相同的数字。我想到的是创建索引数组,然后在函数内部将当前链接与数组中的现有链接进行比较。如果找到相同的内容,则将已索引的链接与索引号(将是文本中的链接号)一起使用。

问题:当我在函数中创建并添加url到索引中时,

 $arr=array();
    $array[] = $url[0];

var_dump($ arr)显示所有具有相同索引号0的链接。如何解决此问题?谢谢。

1 个答案:

答案 0 :(得分:0)

如果您在回调中声明数组,则可能会得到此信息,因为该函数为每个项目调用一次,因此不记得以前的值。

一种简单的方法是在外部定义数组并在回调中use()定义值,这使函数可以在其作用域之外访问变量...

$arr=array();
echo preg_replace_callback('/regex/',
    function ($links) use (&$arr) {
        $reg = "/regex/i";
        preg_match($reg, $links[0], $url);

        if ( isset($arr[$url[0]]) ) {
            $count = ++$arr[$url[0]];
        }
        else {
            $count = 0;
            $arr[$url[0]] = $count;
        }
        return '<a href="'. $url[0] .'" target="_blank" rel="noopener noreferrer">['. $count++ .']</a>';
    }, $html);  

必须注意:(无论如何对我来说)通常使用DOMDocument之类的东西来处理HTML / XML更好,因为它可以理解文档的结构和语义。