В настоящее время я пытаюсь разместить что-то вроде этого 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
@IdontDownVote Я думал об этом, но это кажется беспорядочным ...
"Грязный?" Я бы сказал, что трактовать язык разметки как простую текстовую строку беспорядочно!



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Тогда избавьтесь от фиктивного веб-сайта.
$main = get_the_content_with_formatting();
$stripped = str_replace('href = "', 'href = "https://shortdomain.com/api?p=', $main);Что происходит с <a class = "foo" href = "...">. Или, если на то пошло, просто с двумя пробелами между «a» и «href».
затем удалите <a
Это хорошая задача для встроенных в 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>
Никогда не делайте ошибки, анализируя 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.
На самом деле я думаю, что он может предоставлять только часть содержимого документа в $main, так что этот код в порядке.
Сложно сказать из вопроса. Думаю, вы, наверное, правы.
Если вы делаете это на стороне клиента, это довольно безболезненно с 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/");
Я действительно не тестировал его, но он должен работать нормально.
вы можете использовать парсер DOM в php