在每次出现href外观之前放置文字?

时间:2018-11-21 01:52:36

标签: javascript php jquery

我目前正在尝试将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。

是否可以使用JavaScript或PHP为每个href加上所需链接的前缀?

这里是$main

中内容的选择器
#the-post > div.post-inner > div.entry > p > strong > a

5 个答案:

答案 0 :(得分:2)

对于PHP的内置DOMDocumentDOMXpath类,这是一项很好的任务。使用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>

Demo on 3v4l.org

答案 1 :(得分:2)

永远不要犯错误解析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();

答案 2 :(得分:1)

如果您正在此客户端上进行操作,那么使用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>

答案 3 :(得分:1)

您可以将属性选择器与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/");

我没有真正测试它,但是它应该可以正常工作。

答案 4 :(得分:0)

然后删除虚拟网站。

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