解析h1,h2和h3标题标签内关键字外观的内容

时间:2010-10-28 18:27:03

标签: php regex

鉴于内容块,我希望在PHP中创建一个函数来检查h1-h3标头标签中是否存在关键字或关键字短语......

例如,如果关键字为“ Blue Violin ”,则文本块为...

你没有看到很多蓝色小提琴。大多数小提琴都有自然的光洁度。 < h1>如果你看到一把蓝色小提琴,它真的很罕见< / h1>

我希望我的功能能够回归:

  • 关键字词组 出现在h1标记
  • 关键字词组 不会出现在h2标记
  • 关键字词组 不会出现在h2标记

2 个答案:

答案 0 :(得分:2)

您可以使用DOM和以下XPath

/html/body//h1[contains(.,'Blue Violin')]

这将直接或在子节点中匹配包含短语“Blue Violin”的body元素内的所有h1元素。如果它只应出现在直接TextNode中,请将.更改为text()。结果以DOMNodeList返回。

由于您只想知道 if 这个短语,您可以使用以下代码:

$dom = new DOMDocument;
$dom->load('NewFile.xml');
$xPath = new DOMXPath($dom);
echo $xPath->evaluate('count(/html/body//h1[contains(.,"Blue Violin")])');

将返回与此XPath匹配的节点数。如果您的标记无效XHTML,您将无法使用loadXML。请改用loadHTMLloadHTMLFile。此外,如果为其提供指向节点的直接路径,XPath将执行得更快。如果您只有一个h1,h2和h3,请用//h1替换直接路径。

请注意,contains区分大小写,因此上述内容与搜索词组中使用的混合大小写不匹配。不幸的是,DOM(或更好的底层libxml)只支持XPath 1.0。我不确定是否有XPath函数来执行不区分大小写的搜索,但从PHP 5.3开始,您也可以在XPath中使用PHP,例如。

$dom = new DOMDocument;
$dom->load('NewFile.xml');
$xpath = new DOMXPath($dom);
$xpath->registerNamespace("php", "http://php.net/xpath");
$xpath->registerPHPFunctions();
echo $xpath->evaluate('count(/html/body//h1[contains(php:functionString("strtolower", .),"blue violin")])');

因此,如果您需要匹配Mixed Case短语或单词,您可以在使用contains进行检查之前对搜索到的节点中的所有文本进行小写,或者使用您在此处可能会发现有用的任何其他PHP函数。

答案 1 :(得分:0)

除了将PHP函数包含在类中之外,您还可以简单地将Xpath PHP对象转换为常规PHP数组,然后使用PHP中的常规字符串搜索函数直接进行搜索:http://fsockopen.com/php-programming/your-final-stop-for-php-xpath-case-insensitive