简单的HTML DOM - 替换某个单词的所有出现 - 在不影响属性(Simple HTML DO

2019-09-28 12:53发布

我在想:我将如何改变某个单词的所有出现在HTML,但只能在外面的标签?

例如:可以说,我想替换所有出现myWordToReplace<a href="#">myWordToReplace</a>

所以这个HTML

<p data-something="myWordToReplace"> myWordToReplace andSomeOtherText</p>

应产生

<p data-something="myWordToReplace"> <a href="#">myWordToReplace</a> andSomeOtherText</p>

我试图用正则表达式来实现这一点,但它也是一个烂摊子 - 我想也许DOM解析器会做的伎俩? 任何帮助表示赞赏?

编辑:@ Muhammet的回答就可以了,如果你所有的文字被包裹在一些标签-但如果你的文字部分是没有标签,文本不会被替换,当然。 现在我想得实现这一目标。

例如:如果我想改变myWordsomeOtherWord

Nam myWord pharetra <strong>auctor myWord</strong>

应产生

Nam someOtherWord pharetra <strong>auctor someOtherWord </strong>

但现在它只是改变了第二个字 - 强标签中的一个。

Answer 1:

你可以做这样的事情

$html = file_get_html($file_url);
$content = $html->find('text');

foreach($content as $line) {
    if(strpos($line->innertext, 'myWordToReplace') !== false) {
        $line->innertext = str_replace('myWordToReplace','<a href="#">myWordToReplace</a>', $line->innertext);
    }
}


Answer 2:

这里是另一个基于DOM的溶液来包装文本节点的一部分结合到<a>标签(使用search作为样品):

$html = "<html><body>\n<!-- This is a comment for search //-->\n<span class=\"search\">New search performed</span></body></html>";
$key = "search";
$dom = new DOMDocument();
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$tt = $xpath->query('//text()');

foreach ($xpath->query('//text()') as $textNode) {
    $fragment = $dom->createDocumentFragment();
    $text = $textNode->nodeValue;

    while (($pos = stripos($text, $key)) !== false) {
      $fragment->appendChild(new DOMText(substr($text, 0, $pos)));
      $word = substr($text, $pos, strlen($key));

      $lnk = $dom->createElement('a');
      $lnk->appendChild(new DOMText($word));
      $lnk->setAttribute('href', '#');
      $fragment->appendChild($lnk);

      $text = substr($text, $pos + strlen($key));
    }
    if (!empty($text))
      $fragment->appendChild(new DOMText($text));
    $textNode->parentNode->replaceChild($fragment, $textNode);
}
echo $dom->saveHTML();

这里是一个IDEONE演示



Answer 3:

这是对我工作的伟大。 我不知道为什么它不走“数据的东西”,它似乎不喜欢这两个词之间的破折号。 但是,随着它的作品,我希望这是对你有用。

我使用简单的HTML DOM库

$my_html = '<p data="myWordToReplace"> myWordToReplace </p>';
$html = str_get_html($my_html);

foreach($html->find('p') as $p) {
    if (!empty($p->data) && ($p->data == 'myWordToReplace')) {
        $p->innertext = '<a href="#">'. $p->innertext .'</a>';
    }
}

echo $html; 


文章来源: Simple HTML DOM - replace all occurrences of a certain word - without affecting attributes