Как обработат ссылки?

Имеется строка, в которой есть текст, изображения и ссылки. Ссылки есть двух видов:

1. Ссылки в которых есть часть go.php?url в href
2. Ссылки в которых нет части go.php?url в href

Как проверить такую строку и все ссылки в которых есть часть go.php?url обернуть в div?
  • Вопрос задан
  • 80 просмотров
Решения вопроса 1
<?php 

// Входная строка
$text = '<a href="/go.php?ff">Ссылка 1</a><img src="/images/foo.jpg" alt="img"><a href="/some.php?helloworld"></a><p>Проверочка</p><a href="/go.php?dvb">Ссылка 2</a>';

// Количество ссылок, которое будет обёрнуто в <div>
$links_count = 0;

// Служебная перменная (смещение, чтобы избежать ненужных повторных замен)
$offset = 0;

// Считаем количество ссылок, которое надо обернуть
$links_count = substr_count($text, '<a href="/go.php');

// Если таких ссылок нет, то die
if(!$links_count) die;

// Длина строки закрывающего тега ссылки
$closing_tag_length = strlen('</a>');

// Создание текстового поля
echo '<textarea readonly rows="35" cols="80">';

// Вывод входной строки и количества оборачиваемых ссылок
echo 'Входная строка:', PHP_EOL, PHP_EOL, $text, PHP_EOL, PHP_EOL, '---------------------------', PHP_EOL;
echo 'Обнаружено ссылок, подлежащих замене: ', $links_count, PHP_EOL, PHP_EOL;

// Первоначальная и быстрая замена всех открывающих тегов (добавление перед ними <div>)
$text = str_replace('<a href="/go.php', '<div><a href="/go.php', $text);

// Цикл для замены "</a>" на "</a></div>" для тех ссылок, в которых есть go.php
for($i = 0; $i < $links_count; $i++)
{
    // Вычисление стартовой позиции
    $link_start = strpos($text, '<a href="/go.php', $offset);
    // Вычисление позиции закрывающего тега
    $link_end = strpos($text, '</a>', $link_start);
    // Сохранение смещения
    $offset = $link_end;
    // Замена
    $text = substr_replace($text, '</div>', $link_end + $closing_tag_length, 0);
}

// Вывод выходной строки
echo '---------------------------', PHP_EOL;
echo 'Выходная строка:', PHP_EOL, PHP_EOL;
echo $text, PHP_EOL;
echo '</textarea>';

?>
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Azperin
Дилетант
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы