【问题标题】:Swap anchor href with img src in php/wordpress在 php/wordpress 中将锚点 href 与 img src 交换
【发布时间】:2012-07-29 00:32:26
【问题描述】:

我有一个图像很重的 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>

edit: 没写完就意外发布了。

到目前为止,我有一个 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设置为相同的图像(最后一个)。 所以这就是我卡住的地方。现在呢?

【问题讨论】:

  • 您应该使用 preg_replace_callback 并在函数 / 中处理替换逻辑,而不是使用循环。或者使用效率更低但更简单的 DOM 方法,更好的是 phpQueryQueryPathqp($html)-&gt;find("a img") 等。
  • 我想过这个,但我真的不认为它会有所帮助。我需要循环,以便可以访问存储在数组中的 src。不过我可能错了。

标签: php regex image wordpress anchor


【解决方案1】:

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

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

每次您在循环中调用它时,它都会将您的所有 href 标记替换为 $m[1][$k] 的当前值。因此,在循环的每次迭代结束时,您的 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 数组中的适当元素。

【讨论】:

  • 哈哈,是的,我确实明白为什么要显示最后一张图片,只是不知道从那里去哪里。 preg_replace 限制有效!我应该早先在手册页中看到这一点,但显然我完全掩盖了它。我最终做的是在每个锚点上设置一个属性作为一种“标志”,然后循环遍历它们,只搜索带有标志的锚点,并且只执行一次替换。再次感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-20
  • 2013-12-17
  • 2016-06-03
相关资源
最近更新 更多