2009-11-19 2 views
1

[Edited - Sorry Bart] Я просмотрел другие ответы, но изо всех сил старался соответствовать этому. Я хочу обернуть тег изображения, где src является вторым атрибутом (после названия) с определенным тегом привязки, который содержит ссылку на изображение, найденное в src из тега изображения.regex to wrap img tag с href containg src

Пример img-тега в строке. Это было введено через tinymce wysiwyg и всегда добавляет название, затем src.

<img title="who_main_Layer_1.jpg" src="../../images/who_main_Layer_1.jpg" alt="who_main_Layer_1.jpg" width="380" height="268" /> 

мне нужно взять все эти и завернуть со следующими HREF:

<a href="event:images/expand/image.jpg"><img src=”images/image.jpg” /></a> 

Изображение в исходные тексты указывает на эскизе и (Flash-AS3 Event) выскакивает полную версию размера. Оба изображения назвали одни и те же самые разные папки.

Вот полный пример строки, которые необходимо будут регулярное выражение работают против (Из-за конфиденциальные данные я замещенный текст Lorem Ipsum, но расположение и тот же!):

<p>Lorem ipsum dolor sit amet</p> 
<p>&nbsp;</p> 
<p>Lorem ipsum dolor sit ametLorem ipsum dolor sit ametLorem ipsum dolor sit 
ametLoremipsum dolor sit ametLorem ipsum dolor sit ametLorem ipsum dolor sit ametLorem 
ipsum dolor sit ametLorem ipsum dolor sit ametLorem ipsum dolor sit amet</p> 
<p>&nbsp;</p> 
<p><img title="who_main_Layer_1.jpg" src="../../images/who_main_Layer_1.jpg" 
alt="who_main_Layer_1.jpg" width="380" height="268" /></p> 
<p>&nbsp;</p> 
<p>Lorem ipsum dolor sit ametLorem ipsum dolor sit ametLorem ipsum dolor sit ametLorem 
ipsum dolor sit ametLorem ipsum dolor sit ametLorem ipsum dolor sit ametLorem ipsum 
dolor sit ametLorem ipsum dolor sit ametLorem ipsum dolor sit ametLorem ipsum dolor 
sit 
ametLorem ipsum dolor sit ametLorem ipsum dolor sit amet</p> 
<p>&nbsp;</p> 
<p><img title="who_main_Layer_1.jpg" src="../../images/who_main_Layer_1.jpg" 
alt="who_main_Layer_1.jpg" width="380" height="268" /></p>` 

Многим спасибо Marc

+0

Повторите отправку кода. См. Http://stackoverflow.com/editing-help, как это сделать должным образом. –

+0

Спасибо, Барт. Поэтому, чтобы задать вопрос, мне нужно найти все теги изображений в строке, а затем обернуть их с помощью href следующим образом: '' Имена изображений - это то же самое, только в другом каталоге. Миниатюры и полноразмерные изображения. – ed103

+0

Марк, в вашем оригинальном посте вы говорили о поиске тегов img, чьи атрибуты имели определенный порядок, но вы ничего не говорите об этом, и ни один из них не содержит никаких намеков на него. Измените свое оригинальное сообщение (не добавляйте к нему комментарии) и подробно объясните, что именно вы пытаетесь сделать, иначе я не могу помочь. –

ответ

3

Попробуйте этот код:

<?php 
$str = '<img title="who_main_Layer_1.jpg" src="../../images/who_main_Layer_1.jpg" alt="who_main_Layer_1.jpg" width="380" height="268" />'; 

preg_match('#src="(?:.*/)?(.*?)"#', $str, $match); 
$src = $match[1]; 
?> 
<a href="event:images/expand/<?php echo $src; ?>"><img src=”images/<?php echo $src; ?>” /></a> 

EDIT: другая версия для учета нескольких тегов в строке:

$replace = '<a href="event:images/expand/$1"><img src="images/$1" /></a>'; 
$str = preg_replace('#<\s*img.*?src="(?:[^"]+/)?(.*?)".*?>#s', $replace, $str); 
+0

Это прекрасно работает для этой строки. Благодарю. Это не работает, когда примерный тег встроен в другую строку и, возможно, несколько тегов? Как взять ваш пример и заменить его обратно на исходную строку? Cheers – ed103

+0

Также приводятся примеры этих случаев. Это риск только одного примера. –

+0

Отредактированный мой ответ с версией для нескольких тегов, посмотрите, работает ли она для вас. –

3

Схожие вопросы были отвечены несколько раз, и ответ всегда один и тот же: do not use regular expressions to tamper with HTML. В PHP вы можете использовать XPath и расширения SimpleXml или DOMParser, чтобы решить эту проблему.

Извините за размещение ссылок на мои собственные ответы, но сами ответы и вопросы, на которые они отвечают, содержат много информации по этому вопросу.

+0

Спасибо, я посмотрю на эти ссылки. Начиная с «не использовать регулярное выражение» :) Я был уверен, что вы можете использовать его; но будет читать сейчас. Приветствия. – ed103

+0

Вы можете использовать его, но он быстро становится очень сложным, потому что то, что вы манипулируете, - это грамматика, которая (в основном) принимает к сведению структуру, но игнорирует макет, тогда как regexp - механизм пошагового характера. –

0

Попробуйте это:

$newString = preg_replace('`<img([^>]*)src="\\.\\./\\.\\./images/([^"]+)"([^>])*>`','<a href="event:images/expand/$2"><img$1src="images/$2"$3></a>', $oldString); 

Ограничения являются:

  • Он будет применять изменения в таких вещах, как <input value='<img src="../../images/test.jpg/>"'/>
  • Если " заменяются ' в ваших IMG тегов, вы должны изменить регулярное выражение
  • Он задохнется на вещах, как <img alt="6>5" src="../../images/test.png"/>

Я согласен с другими комментаторами, говоря, что regexp плохо разбираются в HTML. Но здесь почти нет синтаксического анализа, и формат замещаемых вещей, кажется, находится под контролем (порожденным tinymce).

+0

Спасибо Арк. Решение Kempers выше, похоже, сделало трюк. – ed103

Смежные вопросы