php: заменить текст внутри контейнера ссылкой. preg_replace? - PullRequest
0 голосов
/ 25 ноября 2010

Я искал ответ на простой вопрос, но безрезультатно.

У меня есть вывод 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 на самом деле хорошо сформирован, пришлось заменить <&> в якорях и изображениях на [[и]] соответственно, так что он будет публиковаться.)

Я хотел бы обернуть ссылку вокруг текстового содержимого каждого (p) классом "wp-caption-text", URL которого должен иметь следующий формат:

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

(поэтому Джон Доу будет ссылаться на: / 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); ?>

Это прекрасно заменяет текст пустым якорем, я застрял в том, как использовать обратную ссылку для создания URL ссылки.

Несколько заметок :

Ссылка должна заключать в себе только текст (возможно, потребуется позже обернуть только часть текста, но я перейду этот мост, когда подойду к нему)

Wordpress не разрешит это через wysiwyg без обходного пути, чтобы предотвратить разбор ссылок, однажды кто-нибудь может прийти и испортить формат (отсюда и жесткое кодирование), так что для этого нет полезных обходных путей wp. *

Ссылка на изображение должна оставаться в полноразмерном изображении (продолжается галерея jquery), поэтому перенос всего изображения и / или элемента div в ссылку не поддерживается

Приветствую за любую помощь, которую вы можете мне дать.

Andy

Ответы [ 2 ]

0 голосов
/ 25 ноября 2010

Я сделал это!

Спасибо Джорди за то, что он обнаружил оригинальный недостаток.

Я нашел эту вызывающую функцию внутри preg_replace, которая находится внутри функции

, что привело меня к использованию 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>';

    }
?>
0 голосов
/ 25 ноября 2010

Я думаю, вам нужно поместить часть, которую вы хотите сопоставить (текст) в скобках, чтобы сохранить ее в обратной ссылке.Как это:

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