我有这个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节点中包含该单词?
看起来我的方法是完全错误的,它必须是另一种方法,它只是我现在看不到它。
答案 0 :(得分:0)
我们的想法是使用正则表达式模式找到这些单词,并在preg_replace函数的帮助下将它们包装起来。
答案还包含类似DOM的方法,请参阅已获得3票的答案。
我想我得到了答案。
如果有人有更好的解决方案,请随意将其添加到此处。