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

时间:2012-07-29 00:32:26

标签: 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"></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设置为相同的图像(最后一个)。 所以这就是我被困住的地方。现在怎么办?

1 个答案:

答案 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数组中的相应元素。