【问题标题】:Replace words in text with links but not in pictures用链接替换文本中的单词,而不是图片中的单词
【发布时间】:2018-10-12 14:20:25
【问题描述】:

我有一个文本。 在这个文本是一个图片。 我想用链接替换柏林的每个单词。 现在我遇到了问题,它位于图片的旧部分也是柏林,这也被替换了。

<?php
$content = "
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor.
Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
<img class='bild' src='https://berlin.link/ alt='Bild von Berlin' width='300' height='200' />
Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet, vulputate, arcu.
";

$content = str_replace("Berlin", "<a href='//Berlin.test'>Berlin</a>", $content);

return $content;
?>

有没有可能图片中的柏林没有被替换? 注意 该代码只是一个示例。我通常从 wordpress 获取内容。 但这应该与它无关。我想。

【问题讨论】:

  • 它对我来说效果很好。你有什么错误吗?
  • 尝试在要替换的单词前后使用空格。比如, $content = str_replace(" Berlin ", " Berlin ", $content);由于链接中的Berlin一词周围没有空格,因此不符合替换条件。
  • alt 中可能有更多文本。 berlin.linkalt='图片来自柏林字'width='300' height='200' />
  • 那不应该被替换!:berlin.link alt='Bild von Berlin' width='300' height='200' />

标签: php wordpress


【解决方案1】:

试试这个:

$content = "Berlin Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. <img class='bild' src='https://berlin.link/ alt='Bild von Berlin' width='300' height='200' /> Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede.";

$replaced = preg_replace('/<.*?>(*SKIP)(*FAIL)|Berlin/', "<a href='//Berlin.test'>Berlin</a>", $content);

var_dump(htmlentities($replaced));

所以使用 preg_replace,正则表达式的第一部分(| 符号之前)告诉它跳过 <...> 标记内的任何内容。之后|是你想要替换的。第二个参数是你想要替换的参数。

希望这会有所帮助!

感谢:https://stackoverflow.com/a/29973967/3884381(我以前做过这种事情,但不记得具体细节,所以不得不查一下。)

【讨论】:

    【解决方案2】:

    像往常一样,解析 HTML 最可靠的方法是使用 DOM 解析器,而不是字符串操作。这是相当复杂的,但在遇到奇怪的情况时不会失败。

    $content = "
    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor.
    Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
    <img class='bild' src='https://berlin.link/' alt='Bild von Berlin' width='300' height='200' />
    Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet, vulputate, arcu.
    Berlin
    ";
    
    $search = "Berlin";
    $replace_href = "//Berlin.test/";
    
    $dom = new DomDocument();
    libxml_use_internal_errors(true);
    $dom->loadHTML($content, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
    $xpath = new DomXPath($dom);
    // here we search for every text node with the search term in it
    $nodes = $xpath->query("//text()[contains(., \"$search\")]");
    foreach ($nodes as $node) {
        // explode the string at the search term to get an array
        $parts = explode($search, $node->nodeValue);
        // treat the first one differently because it comes before any matches
        $part1 = $dom->createTextNode(array_shift($parts));
        $node->parentNode->insertBefore($part1, $node);
        // now go through the rest of the string parts
        foreach ($parts as $part) {
            // create the a element, set the attribute value and text content
            $anchor = $dom->createElement("a");
            $anchor->setAttribute("href", $replace_href);
            $anchor->appendChild($dom->createTextNode($search));
            // append it in place
            $node->parentNode->insertBefore($anchor, $node);
            // and then put the original text back
            $node->parentNode->insertBefore($dom->createTextNode($part), $node);
        }
        // get rid of the original text node
        $node->parentNode->removeChild($node);
    }
    echo $dom->saveHTML();
    

    输出:

    <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor.
    Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
    <img class="bild" src="https://berlin.link/" alt="Bild von Berlin" width="300" height="200">
    Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet, vulputate, arcu.
    <a href="//Berlin.test/">Berlin</a>
    </p>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-25
      • 1970-01-01
      • 2011-03-31
      • 2015-03-02
      • 2018-07-22
      • 1970-01-01
      相关资源
      最近更新 更多