我有简单的代码将数字中的链接替换为数字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的链接。如何解决此问题?谢谢。
答案 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更好,因为它可以理解文档的结构和语义。