PHP xpath搜索查询

时间:2012-12-31 18:44:32

标签: php xpath

在另一个问题的帮助下,我使用xpath从网站返回查询,但我需要它来搜索特定的标题。

到目前为止,这是我的代码:

<?php
libxml_use_internal_errors(true);
$dom = new DomDocument;
$dom->loadHTMLFile("http://www.example.com");
$xpath = new DomXPath($dom);
$nodes = $xpath->query("//span[@class='newprodtext' and contains(translate(text(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'adidas')][1]");

foreach ($nodes as $i => $node) {

echo "Node($i): ", $node->nodeValue, "\n";
}

?>

这是一个示例HTML:

<td colspan="2" align="center">
  <a href="product.html" style="text-decoration:none">
   <span class="newprodtext">Nike Shoes</span>
  </a>
</td>
<td colspan="2" align="center">
  <a href="product.html" style="text-decoration:none">
   <span class="newprodtext">Nike T-Shirt</span>
  </a>
</td>
<td colspan="2" align="center">
  <a href="product.html" style="text-decoration:none">
   <span class="newprodtext">Adidas Shoes</span>
  </a>
</td>

我需要搜索以查找两个单词,例如我是否正在寻找“Adidas Shoes”我希望查询返回TRUE但我还希望它返回TRUE如果它找到反向术语“Shoes Adidas”或小写的“鞋子adidas”而不是精确的字符串。

1 个答案:

答案 0 :(得分:1)

只需将xpath更改为以下内容:

//span[@class='newprodtext' and contains(translate(text(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'adidas shoes')]

如果你想要包含你的搜索词的节点,那么

translate(//span[@class='newprodtext']/text(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')='adidas shoes' or `translate(//span[@class='newprodtext']/text(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')='shoes adidas'

如果您想要T / F响应。这里有两种不同的方法,一种使用contains(),另一种只使用translate()。如果你想要'adidas shoes'和'shoes adidas'的精确匹配,那么请使用后一种解决方案。如果您只是在寻找'adidas',请使用第一个解决方案,如果您想要T / F,请对后者应用相同的更改。

<强>更新 如果你想只是第一个带有“adidas”的节点,那么请使用:

//span[@class='newprodtext' and contains(translate(text(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'adidas')][1]

如果你想在T / F中用它包围一个boolean(//span[@class='newprodtext' and contains(translate(text(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'adidas')][1])。如果您确实需要其他搜索词,请将contains()部分复制并粘贴回来,并将adidas更改为单词。