替换HTML标签外的内容的正则表达式

3
我有一个函数,可以通过扫描博客文章、新闻和其他项目中的某些核心关键词来帮助链接我的网站内部页面。然后,它将这些关键词替换为相应页面的链接。
我遇到了一个问题,一些不应该被替换为链接的单词被替换了。例如,我在一些HTML表格中有一个摘要标签,其中包含表格内容的简短摘要。因此,例如,我可能有一个看起来像这样的标签:
<table width="500" cellspacing="0" cellpadding="4" border="0" summary="This table contains a list of all car parts in inventory along with their corresponding prices">
...
</table>

我的函数错误地用链接替换了关键词或短语,比如“汽车零件”。我该如何构造我的替换正则表达式,在这种情况下不进行替换,但在段落甚至HTML表格单元格内出现时进行替换。
非常感谢您的帮助和指导!
编辑:为了澄清,我正在使用PHP渲染我的页面。在内容输出为HTML到页面之前,我使用str_replace()。我想能够将其替换为ereg_replace(),以便仅在满足某些条件(即如上所述)时替换内容。如果这引起了任何困惑,请原谅!

1
你当前的正则表达式模式是什么? - josh.trow
1
似乎普遍认为,在处理可能相对复杂的HTML规则时,不应该与正则表达式一起使用。您是否考虑过使用XML解析器来识别要运行替换的部分? - Jeff Parker
抱歉,我应该澄清一下,我会添加一个EDIT语句。我正在使用PHP来呈现页面输出。我将在PHp ereg_replace()中使用正则表达式,而不是使用str_replace()。 - Dexter
1个回答

6

不要使用正则表达式解析HTML。使用PHP DOM:

$DOM = new DOMDocument;
$DOM->loadHTML($str); // Your HTML

//get all tds
$cells = $DOM->getElementsByTagName('td');

// Do stuff to the cells

//get all paragraphs
$paragraphs = $DOM->getElementsByTagName('p');

// Do stuff to the paragraphs

// Etc...

我该如何处理异常情况?例如,我想将单词“car”替换为一个链接,但是这个单词是另一个句子的一部分,整个句子包含一个链接。在这种特殊情况下,我不想将其链接,怎样才能使它智能地忽略这种情况并得到正确处理? - Dexter
以下是一种解决方案:`while ($parentNode = $node->parentNode) { /* 检查 $parentNode 是否为锚点,如果是则中止插入 */ }`或者,您可以创建一个XPath查询来查找没有锚点的单元格/段落。有关更多信息,请参见PHP DOM XPath文档 - Håvard S

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接