0

我有一个非常图像重的 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设置为相同的图像(最后一个)。所以这就是我卡住的地方。现在怎么办?

4

1 回答 1

0

不知道我是否在这里说明了显而易见的事情,但你知道为什么它将它设置为数组中的最后一个吗?问题是这一行:

$content = preg_replace($pattern, $replacement, $content);

每次您在循环中调用它时,它都会将您的所有 href 标记替换为 $m[1][$k] 的当前值。因此,在循环的每次迭代结束时,您的 href 都将设置为与循环的该迭代相对应的图像。因此,为什么最终结果都包含与循环的最后一次迭代相对应的图像。

可能的解决方案:

preg_replace 有一个“限制”参数,您可以将其设置为 1,以确保每次仅进行 1 次替换。如果您可以使您的 $pattern 与已替换的 href 不匹配,那么这应该可以解决您的问题。

如果没有,mario 的 'preg_replace_callback' 解决方案应该可以工作。要查看如何在 preg_replace_callback 中检查您要替换的实例,请参阅以下问题:我能否以某种方式知道在 preg_replace_callback 的回调中发生了哪个替换?

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

于 2012-07-29T02:05:26.227 回答