在php/wordpress中用img src交换锚href

在php/wordpress中用img src交换锚href,php,regex,image,wordpress,anchor,Php,Regex,Image,Wordpress,Anchor,我有一个wordpress主题,非常形象化。图像被包装在锚定标签中,我需要直接链接到文件。下面是一个示例图像的标记: <a href="Link_to_attachment_page" ><img src="Direct_link_to_file"></a> 我需要的是它的格式如下: <a href="Direct_link_to_file" rel="shadowbox"><img src="Direct_link_to_file"

我有一个wordpress主题,非常形象化。图像被包装在锚定标签中,我需要直接链接到文件。下面是一个示例图像的标记:

<a href="Link_to_attachment_page" ><img src="Direct_link_to_file"></a>

我需要的是它的格式如下:

 <a href="Direct_link_to_file" rel="shadowbox"><img src="Direct_link_to_file"></a>

编辑:在未完成此操作的情况下意外发布

到目前为止,我有一个preg_match_all,它获取页面上每个图像的src,并将其存储在一个数组中。像这样:

preg_match_all("/<img .*?(?=src)src=\"([^\"]+)\"/si", $content, $m); 
preg\u match\u all(“/
接下来,我在循环中使用preg_replace将每个锚标记的href更改为数组中相应的src:

for($k = 0; $k <$length; $k++){
   $pattern ="/<a(.*?)href=('|\")(.*?).(bmp|gif|jpeg|jpg|png)('|\")(.*?)>/i";
   $replacement = '<a$1 rel="shadowbox" href="'.$m[1][$k].'"$2$3.$4$5>';
   $content = preg_replace($pattern, $replacement, $content);
   }

for($k=0;$k不知道我是否在这里说明显而易见的问题,但是你知道为什么它会将它设置为数组中的最后一个吗?问题是这行:

$content = preg_replace($pattern, $replacement, $content);
每次在循环中调用它时,它都会用当前值$m[1][$k]替换所有href标记。因此,在循环的每次迭代结束时,href都会设置为与循环的该次迭代对应的图像。因此,最终结果都包含与循环的上一次迭代对应的图像

可能的解决办法:

preg_replace有一个“limit”参数,您可以将该参数设置为1,以确保每次只进行1次替换。如果您能够使$pattern与已替换的href不匹配,则应该可以解决您的问题

如果没有,mario的“preg_replace_callback”解决方案应该会起作用。要查看如何在preg_replace_callback中检查要替换的实例,请参阅以下问题:


知道了这一点,您可以访问$m数组中的适当元素。

您应该在函数中使用和处理替换逻辑,而不是使用循环。或者使用效率更低但更简单的DOM方法,更好的是
phpQuery
QueryPath
使用
qp($html)->find(“img”)
等等。我考虑过这一点,但我真的不认为它会有帮助。我需要循环,这样我就可以访问存储在阵列中的src。不过我可能错了。哈哈,是的,我确实理解为什么要显示最后一张图像,我只是不确定从那里去哪里。preg_replace限制起作用了!我应该在男人身上看到这一点我最后做的是在每个锚点上设置一个属性作为一种“标志”,然后在它们之间循环,只搜索带有标志的锚点,并且只执行一次替换。再次感谢您的帮助。