我有一个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_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);
}
现在,成功将href设置为存储在数组中的值。但它将每个href设置为相同的图像(最后一个)。 所以这就是我被困住的地方。现在怎么办?
答案 0 :(得分:0)
不知道我是否在这里说明了这一点,但是你知道为什么它将它设置到数组中的最后一个?问题是这一行:
$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中检查您要替换的实例,请参阅此问题:Can I somehow know which replacement is taking place from within a callback of preg_replace_callback?
知道这一点,你可以访问$ m数组中的相应元素。