查找并替换具有链接但忽略div内容的关键字

时间:2019-02-28 20:43:13

标签: php

我写了一个函数来查找关键字并将其转换为链接以下是整个函数:

function Linkkeywords($linksArray, $content){
    $links = $linksArray;
    $links_keys = array_keys($links);
    $linked = array();
    $existingLinks = array();
    foreach ($links_keys as $word ){
        if(!in_array($word, $existingLinks)){
            $existingLinks[] = $word;
            $linked[] = '<a href="'.$links[$word].'">'.$word.'</a>';
        }
    }
    foreach($existingLinks as  $key => $word){
        $c =   preg_replace('|(?!<[^<>]*?)(?<![?./&])\b('.$word.')\b(?!:)(?![^<>]*?>)|iu', $linked[$key], $content,1);
    }
    return $c;
}//End Function Linkkeywords

$linksArray = Array ( 'hello' => 'http://hello.com' );

$content = '
 <div class="alert alert-post-summary">hello world</div>

  hello world
';
echo Linkkeywords($linksArray, $content);

此函数的输出如下:

 <div class="alert alert-post-summary"><a href="http://hello.com">hello</a> world</div>

  hello world

我想忽略<div class="alert alert-post-summary">

的内容文本

我喜欢,该函数的输出如下:

 <div class="alert alert-post-summary">hello world</div>

  <a href="http://hello.com">hello</a> world

1 个答案:

答案 0 :(得分:0)

如果要确保关键字不在HTML元素中,最简单的解决方案是使用DOMDocument来解析字符串。

可以如下创建DOMDocument实例:$doc = DOMDocument::loadHTML($content);

然后可以遍历Document子级: `

foreach ($document->childNodes() as $child) {
 if ($child->nodeType === XML_TEXT_NODE) 
  $child->textContent = str_replace($word, $link, $child->textContent);
}

`

最后检索DOMDocument的textContent以获取您的字符串。 这将替换html字符串的每个直接文本子节点中的关键字。