php:用链接替换容器中的文本。 preg_replace函数?

时间:2010-11-25 12:23:32

标签: php preg-replace replace str-replace

我已经搜索了一个似乎是一个简单问题的答案,但无济于事。

我有一些HTML输出,例如:

<div id="attachment_1098" class="wp-caption alignleft" style="width: 160px">[[ a href="mydomain.com/wp-content/uploads/2010/11/photo-1.jpg" ]][[img class="size-thumbnail wp-image-1098" title="John Doe" src="mydomain.com/wp-content/uploads/2010/11/photo-1.jpg" alt="John Doe" width="150" height="200" /]][[ /a ]]<p class="wp-caption-text">John Doe</p></div>
<div id="attachment_1080" class="wp-caption alignleft" style="width: 160px">[[ a href="mydomain.com/wp-content/uploads/2010/11/photo-2.jpg" ]][[img class="size-thumbnail wp-image-1080" title="Fred Bloggs" src="mydomain.com/wp-content/uploads/2010/11/photo-1.jpg" alt="Fred Bloggs" width="150" height="200" /]][[ /a ]]<p class="wp-caption-text">Fred Bloggs</p></div>
<div id="attachment_1099" class="wp-caption alignleft" style="width: 160px">[[ a href="mydomain.com/wp-content/uploads/2010/11/photo-3.jpg" ]][[img class="size-thumbnail wp-image-1099" title="Jane Doe" src="mydomain.com/wp-content/uploads/2010/11/photo-3.jpg" alt="Jane Doe" width="150" height="200" /]][[ /a ]]<p class="wp-caption-text">Jane Doe</p></div>
<div id="attachment_1096" class="wp-caption alignleft" style="width: 160px">[[ a href="mydomain.com/wp-content/uploads/2010/11/photo-4.jpg" ]][[img class="size-thumbnail wp-image-1096" title="Joe Public" src="mydomain.com/wp-content/uploads/2010/11/photo-4.jpg" alt="Joe Public" width="150" height="200" /]][[ /a ]]<p class="wp-caption-text">Joe Public</p></div>

(上面的html实际上已经很好了,不得不分别用[[和]]替换锚点和图像中的&lt;&amp;&gt;所以它会发布。)

我想用每个(p)的文本内容包含一个“wp-caption-text”类的链接,其网址应具有以下格式:

'/my-page-root/'.strtolower(str_replace(' ','-',$linkText)).'';

(所以John Doe会链接到: / my-page-root / john-doe 等)

现在,我已经使用了preg_replace,但我无法弄清楚如何从反向引用创建链接URL。这让我觉得必须有一种更简单的方法(可能更快捷的方式?)

无论如何,这是我做的代码:

<?php $contentLinked = preg_replace("/(<p class=\"wp-caption-text\">.*<\/p>)/Us", "<p class=\"wp-caption-text\"><a href=\"\">$1</a></p>",$content); ?>

用空锚替换文本就好了,我不知道如何使用反向引用来创建链接网址。

一些注释

链接必须只包装文本(稍后可能只需要包装部分文本,但是当我来到它时我会穿过那个桥)

Wordpress不会允许通过wysiwyg而没有解决方法来防止剥离链接,有一天其他人可能会进入并破坏格式(因此硬编码)因此没有有用的wp解决方法。

图像上的链接必须保留为完整大小的图像(jquery图库正在进行中),因此将整个图像和/或div包装在链接中不是一个选项

欢呼,你可以给我任何帮助。

安迪

2 个答案:

答案 0 :(得分:0)

我认为您需要将要匹配的部分(文本)放在括号中,以便将其保存在反向引用中。像这样:

<?php $contentLinked = preg_replace("/(<p class=\"wp-caption-text\">(.*)<\/p>)/Us", "<p class=\"wp-caption-text\"><a href=\"\">$1</a></p>",$content); ?>

答案 1 :(得分:0)

我做到了!

感谢Jordi发现原始缺陷。

我发现了calling function inside preg_replace thats inside a function

引导我使用preg_replace_callback()代替(之前从未使用过,从来没有使用过原因)

如果其他人遇到类似的问题,我的结果代码如下:

<?php $contentLinked = preg_replace_callback("/<p class=\"wp-caption-text\">(.*)<\/p>/Us", 'myCallback',$content);?>

和功能:

<?php 
function myCallback($match){

        return '<a href="'.strtolower(str_replace(' ','-',$match[1])).'">'.$match[1].'</a>';

    }
?>