Размещение текста перед каждым появлением href?

В настоящее время я пытаюсь разместить что-то вроде этого https://shortdomain.com/api?p=a-href-url-here.com перед каждой ссылкой на моем веб-сайте в конкретном div.

$main = get_the_content_with_formatting();
$stripped = str_replace('<a href = "http://example.net/', '<a href = "https://shortdomain.com/api?p=http://example.net/', $main);

Вышеупомянутый метод работает, но только если ссылка представляет собой этот URL-адрес, а с любым другим, очевидно, он просто вернет стандартный URL-адрес.

Есть ли способ добавить префикс моей желаемой ссылки к каждому href с помощью JavaScript или PHP?

Вот селектор содержимого внутри $main

#the-post > div.post-inner > div.entry > p > strong > a

вы можете использовать парсер DOM в php

user10226920 21.11.2018 03:03

@IdontDownVote Я думал об этом, но это кажется беспорядочным ...

John Doe 21.11.2018 03:04

"Грязный?" Я бы сказал, что трактовать язык разметки как простую текстовую строку беспорядочно!

miken32 21.11.2018 03:09
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
3
60
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Тогда избавьтесь от фиктивного веб-сайта.

$main = get_the_content_with_formatting();
$stripped = str_replace('href = "', 'href = "https://shortdomain.com/api?p=', $main);

Что происходит с <a class = "foo" href = "...">. Или, если на то пошло, просто с двумя пробелами между «a» и «href».

miken32 21.11.2018 03:13

затем удалите <a

ACD 21.11.2018 03:25

Это хорошая задача для встроенных в PHP классов DOMDocument и DOMXpath. Использование xpath гарантирует, что вы меняете только те якоря внутри div, которые вам нужны.

$main = '<div class = "post-inner"><div class = "entry"><p><strong><a href = "http://example.net">link</a></strong></p></div></div>';
$doc = new DOMDocument();
$doc->loadHTML($main, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xpath = new DOMXpath($doc);
$anchors = $xpath->query('//div[contains(@class, "post-inner")]//a');
foreach ($anchors as $a) {
    $a->setAttribute('href', 'https://shortdomain.com/api?p=' . $a->attributes->getNamedItem('href')->nodeValue);
}
echo $doc->saveHTML();

Вывод:

<div class = "post-inner"><div class = "entry"><p><strong>
    <a href = "https://shortdomain.com/api?p=http://example.net">link</a>
</strong></p></div></div>

Демо на 3v4l.org

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

Никогда не делайте ошибки, анализируя HTML как текст; это не! Используйте подходящий парсер DOM для извлечения ваших значений, а затем их изменения.

<?php
$main = "<div><p>Here is some <a href='http://example.com/'>sample</a> text.</p></div>";
$dom = new DomDocument();
$dom->loadHtml($main, LIBXML_HTML_NODEFDTD | LIBXML_HTML_NOIMPLIED);
foreach ($dom->getElementsByTagName("a") as $anchor) {
    $href = $anchor->getAttribute("href");
    if ($href) {
        $anchor->setAttribute("href", "https://shortdomain.com/api?p = " . urlencode($href));
    }
}
echo $dom->saveHTML();

Это изменит все привязки в документе, а не только те, которые находятся под div с классом post-inner.

Nick 21.11.2018 03:14

На самом деле я думаю, что он может предоставлять только часть содержимого документа в $main, так что этот код в порядке.

miken32 21.11.2018 03:19

Сложно сказать из вопроса. Думаю, вы, наверное, правы.

Nick 21.11.2018 03:19

Если вы делаете это на стороне клиента, это довольно безболезненно с javascript querySelectorAll:

let as = document.querySelectorAll('#the-post .post-inner .entry p strong a')
as.forEach(a => a.href  = "https://shortdomain.com/api?p = "+a.href)
<a href = "http://example.net/">Don't change</a>
<div id = "the-post">
  <div class = "post-inner">
    <div class = "entry">
      <p>
      change these:
      <strong>
        <a href = "http://example2.net/">some inside </a> <br />
         <a href = "http://example3.net/">some other inside </a>
       </strong></p>
   </div>
  </div>
</div>

Вы можете использовать селектор атрибутов с jquery, чтобы сопоставить все желаемые элементы, а затем использовать метод attr для изменения атрибута href.

$("#the-post > div.post-inner > div.entry > p > strong > a[href=\"http://example.net/\"]")
    .attr("href", "https://shortdomain.com/api?p=http://example.net/");

Я действительно не тестировал его, но он должен работать нормально.

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