[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: версия для печати - печатаем uri в скобках
vovansystems
Есть задача в шаблоне версии страницы для печати в скобках около слова-якоря выводить адрес, куда ведёт ссылка, чтобы на бумаге было видно :)

Долго и упорно вспоминал регэкспы, но никак не могу решить одну проблему - preg_replace заменяет только последнее вхождение.

$text = preg_replace('/<a[^<>]*href="([^"]*)"[^<>]*>(.*)<\/a>/U','$0 ($1)',$text);


Я его уже и от жадности отучил, и какие только варианты не перепробовал..

Сами ссылки разные, но в основном вида (хотя бывают ещё всякие атрибуты типа _target="blank"
<p class="MsoNormal"><a href="http://domain.com/news/1000">Текст якоря</a></p>





Спустя 25 минут, 5 секунд (26.02.2012 - 23:41) sergeiss написал(а):
Цитата (vovansystems @ 27.02.2012 - 00:16)
Есть задача в шаблоне версии страницы для печати в скобках около слова-якоря выводить адрес, куда ведёт ссылка, чтобы на бумаге было видно smile.gif

А на CSS не пробовал? Там можно сделать всё это весьма красиво smile.gif И в коде страниц не надо менять ничего вообще! Только CSS.

Спустя 5 минут, 17 секунд (26.02.2012 - 23:46) vovansystems написал(а):
на css всё легко, но такое решение подсказали позже (как далеко шагнул прогресс):

#content a[href]:after {
content: " (" attr(href) ") ";
}
#content a[href^="/"]:after {
content: " (/" attr(href) ") ";
}

Но всё равно хотелось бы разобраться с preg_replace раз уже столько времени потрачено

Спустя 29 минут, 7 секунд (27.02.2012 - 00:15) nugle написал(а):
Попробуй модификатор g

Спустя 15 часов, 21 минута, 18 секунд (27.02.2012 - 15:36) vovansystems написал(а):
Цитата (nugle @ 26.02.2012 - 21:15)
Попробуй модификатор g

Такого модификатора нет.

Попробывал и маленький u для юникода - всё равно меняет только последнее вхождение..

Спустя 11 минут, 23 секунды (27.02.2012 - 15:48) Visman написал(а):
Цитата (vovansystems @ 27.02.2012 - 20:36)
всё равно меняет только последнее вхождение..

Я взял такой текст
<p class="MsoNormal"><a href="http://domain.com/news/10sdsASASAS0">Ттdddaa якоря</a></p><p class="MsoNormal"><a href="http://domain.com/news/1000">Текст якоря</a></p>

обработал регулярным выражением из первого поста.
Получил в браузере
Ттdddaa якоря (http://domain.com/news/10sdsASASAS0)

Текст якоря (http://domain.com/news/1000)

Обе ссылки обработались.

Спустя 1 минута, 55 секунд (27.02.2012 - 15:50) sergeiss написал(а):
Цитата (vovansystems @ 27.02.2012 - 00:46)
Но всё равно хотелось бы разобраться с preg_replace раз уже столько времени потрачено

А смысл? Зачем тратить время на не самое лучшее решение, если есть уже готовый, более лёгкий вариант?

Не знаю, как кому, а мне лично лень такими делами заниматься smile.gif Потому что одно дело, когда есть разные варианты, но они примерно одного уровня. Там еще можно подумать. Но это, мне кажется, не тот случай, где имеет смысл заморачиваться.
В любом случае потраченное тобой время тебе же на пользу пойдет. Пусть не в этом случае, а в другом.

Спустя 17 минут, 56 секунд (27.02.2012 - 16:08) vovansystems написал(а):
Разобрался. Не обратил внимания, что в якорях ссылок (кроме последней в тексте) были символы разрыва строки - поэтому без модификатора s находило только последний вариант:

<p class="MsoNormal"><a href="http://domain.com/news/1111">Текст новости 
первый</a></p>

<p
class="MsoNormal"><a href="http://domain.com/news/2222">Текст новости
второй </a></p>

<p
class="MsoNormal"><a href="http://domain.com/news/33333">Текст новости третий </a></p>

Цитата
s (PCRE_DOTALL)

If this modifier is set, a dot metacharacter in the pattern matches all characters, including newlines. Without it, newlines are excluded. This modifier is equivalent to Perl's /s modifier. A negative class such as [^a] always matches a newline character, independent of the setting of this modifier.


Так что такой вариант работает:
$text = preg_replace('/<a[^<>]*href="([^"]*)"[^<>]*>(.*)<\/a>/sU','$0 ($1)',$text);
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.