Получить все hrefs из строки, но затем заменить другим методом

Скажем, у вас есть динамическая строка, полученная в результате вызова ajax. В качестве примера приведу один ответ:

$string = '<div>
    <a href = "http://somelink" class = "possible-class">text</a>
    <a href = "http://anotherlink">other text</a>
</div>';

Как вы можете изменить все URL-адреса href в строке, чтобы они были результатом другого метода, такого как этот пример метода:

function modify_href( $href ) {
  return $href . '/modified';
}

Итак, результирующая строка:

$string = '<div>
    <a href = "http://somelink/modified" class = "possible-class">text</a>
    <a href = "http://anotherlink/modified">other text</a>
</div>';
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
40
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Без дополнительной информации о том, что вам нужно, это один из способов.

$string = '<div>
    <a href = "'.modify_href('http://somelink').'" class = "possible-class">text</a>
    <a href = "'.modify_href('http://anotherlink').'">other text</a>
</div>';

function modify_href( $href ) {
  return $href . '/modified';
}

echo $string;
Ответ принят как подходящий

Чтобы вызвать функцию с совпадениями регулярного выражения, вы можете использовать функцию preg_replace_callback http://php.net/manual/en/function.preg-replace-callback.php. что-то вроде:

function modify_href( $matches ) {
      return $matches[1] . '/modified';
}

$result = preg_replace_callback('/(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?)/', 'modify_href', $string);

Я не тестировал это, но думаю, что это должно сработать. Я получил регулярное выражение отсюда: https://rushi.wordpress.com/2008/04/14/simple-regex-for-matching-urls/

Это не рекомендуется анализировать html с помощью регулярного выражения.

Вы можете использовать DomDocument и createDocumentFragment

function modify_href( $href ) {
    return $href . '/modified';
}

$string = '<div>
    <a href = "http://somelink" class = "possible-class">text</a>
    <a href = "http://anotherlink">other text</a>
</div>';

$doc = new DomDocument();
$fragment = $doc->createDocumentFragment();
$fragment->appendXML($string);
$doc->appendChild($fragment);
$xpath = new DOMXPath($doc);
$elements = $xpath->query("//div/a");
foreach ($elements as $element) {
    $element->setAttribute("href", modify_href($element->getAttribute("href")));
}
echo $doc->saveHTML();

Демо

Другие вопросы по теме