当前位置: 首页 > 知识库问答 >
问题:

用链接替换文本中的单词,但不替换图片中的单词

哈雅珺
2023-03-14

我有一条短信。在这篇文章中是一张图片。我想把每个单词柏林都换成一个链接。现在我有问题,这站在图片的旧部分也是柏林,这也被取代。

<?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获取内容。但这与此无关。我想。

共有2个答案

陆翰藻
2023-03-14

通常,解析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>
姬存
2023-03-14

试试这个:

$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|u replace,正则表达式的第一部分(在|符号之前)告诉它跳过

希望这能有所帮助!

归功于:https://stackoverflow.com/a/29973967/3884381(我以前做过这类事情,但记不清具体细节,所以不得不查一查。)

 类似资料:
  • 问题内容: 有没有办法替换放置在HTML正文中的table元素内的普通文本? 喜欢用“ hi”代替“ hello”吗? 请仅使用不带 jQuery的* JavaScript 。 * 问题答案: 要用另一个字符串替换HTML中的字符串,请使用innerHTML的replace 请注意,这将替换整个正文的第一个实例,包括HTML代码中的任何实例(例如,类名等。),因此请谨慎使用- 为了获得更好的结果,

  • 我想要的输出将是一个包含以下项的JScrollPane: 我发现了创建自定义ListCellRenderer来替换DefaultListModel的建议。在所有的例子中,一个imageIcon是作为图标添加到lable中的,不幸的是,这只在文本的开头添加了一个图标,这不是我想要的。 以下是本网站示例之一的相关部分:

  • 问题内容: 不过,这是一个设计:例如,我放置了一个链接,例如 http://example.com 在 textarea中 。我如何获取PHP以检测它是一个链接,然后将其打印为 我记得以前做过这样的事情,但这并不是傻瓜式的证明,它会因为复杂的链接而中断。 修复它 这只是一个经过深思熟虑的.. stackoverflow也可能会使用它:D 有任何想法吗 问题答案: 让我们看一下需求。您有一些用户提供

  • 问题内容: 我有一个文件(更具体地说是一个log4j配置文件),我希望能够读取该文件并在代码中挑选出某些行并替换它们。例如,在文件中,有一串文本,指示文件的存储目录或记录器的级别。我希望能够替换这些文本字符串而无需读入文件,将其写入另一个文件以及删除原始文件。有没有一种使用Java来查找和替换文件中文本的更有效方法? 这是我尝试使用的文本文件的示例: 我希望能够读取文件并将’DEBUG’替换为另一

  • 问题内容: 好的,所以我有这个yaml文件,我想替换一个字符串 与字符串 但是我不知道该怎么办。这是完整的Yaml文件 问题答案: 假设您使用的操作系统不错,并且您的YAML文档称为:

  • 我想从css选择器获取的文本中替换一个单词,比如 我想用selenium和python这样发送“这是GBH Global我们总部设在伦敦” 我有这段文字“这是我们在伦敦的公司名称”,我可以改变它的格式,以便代码正常工作...