Долго и упорно вспоминал регэкспы, но никак не могу решить одну проблему - 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) |
Есть задача в шаблоне версии страницы для печати в скобках около слова-якоря выводить адрес, куда ведёт ссылка, чтобы на бумаге было видно ![]() |
А на CSS не пробовал? Там можно сделать всё это весьма красиво
![smile.gif](http://phpforum.ru/html/emoticons/smile.gif)
Спустя 5 минут, 17 секунд (26.02.2012 - 23:46) vovansystems написал(а):
на css всё легко, но такое решение подсказали позже (как далеко шагнул прогресс):
Но всё равно хотелось бы разобраться с preg_replace раз уже столько времени потрачено
#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](http://phpforum.ru/html/emoticons/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);