DOM xpath找到#text节点并包装在锚标签中

时间:2014-02-04 19:03:57

标签: php xpath

我有这个HTML代码:

<html><body>
    <p>This PHP should be wrapped with an anchor</p>
    <p>This <a href="bla-bla">PHP</a> seems to be already wrapped with an anchor, skip it</p>
    <p>This <b>Android</b> is just another case I want to wrap it with anchor/p>
</body></html>

我想找到所有那些作为段落一部分的PHP单词并用锚标记包装它们,除了那些已经用a-tags包装的PHP单词。

我有一个(wordpress.org)博客,我想写一个插件,基本上会搜索一些预定义的单词(如PHP,Android等),然后用一个指向他们的标签包装它们特定的维基百科网页。

因此,完成此任务后,上面的代码将如下所示:

<html><body>
    <p>This <a href="wikipedia.com/php-link">PHP</a> has been wrapped with an anchor</p>
    <p>This <a href="bla-bla">PHP</a> was skipped because it was already wrapped with an anchor</p>
    <p>This <b><a href="wikipedia.com/android-link">Android</a></b> was also wrapped. Yhhaaa!</p>
</body></html>

基本上我的代码如下所示:

$html = $xpath->query("/html/body//p//text()");
if ($html) {
    foreach ($html as $par) {
        // I'm trying to find all nodes except those wrapped by <a> tag
        if ($par->nodeType == XML_TEXT_NODE && $par->nodeValue != $par->parentNode->nodeValue) {
            // find all words within the current node that matches my pattern
            preg_match_all('/[A-Z]+[A-Z\-\']{2,}/', $par->nodeValue,$matches);
            foreach ($matches as $match)
                foreach ($match as $word)
                    // is the word like PHP, Android, etc ?
                    if (in_array(strtolower($word), $MY_WORDS)) {
                        wrap_this_word($word); // if so then wrap it!
                    }
        }

    }
}

现在,我能够找到我的节点,然后找到我的单词,但是如何用$-tag在$ par节点中包含该单词?

看起来我的方法是完全错误的,它必须是另一种方法,它只是我现在看不到它。

1 个答案:

答案 0 :(得分:0)

然而,我发现了一种不同的方法:

Regex to match words or phrases in string but NOT match if part of a URL or inside <a> </a> tags. (php)

我们的想法是使用正则表达式模式找到这些单词,并在preg_replace函数的帮助下将它们包装起来。

答案还包含类似DOM的方法,请参阅已获得3票的答案。

我想我得到了答案。

如果有人有更好的解决方案,请随意将其添加到此处。