如何仅返回XPath中的第一个匹配结果?

jul*_*y77 5 php xml xpath

我试图使用XPath string-after来获取Property ID之后的数据:但是结果不是我想要的,它显示了所有与Property ID匹配的结果。我只想要P-000324。这是我的代码

<?php
$getURL = file_get_contents('http://realestate.com.kh/residential-for-rent-in-phnom-penh-daun-penh-phsar-chas-2-beds-apartment-1001192296/');
$dom = new DOMDocument();
@$dom->loadHTML($getURL);
$xpath = new DOMXPath($dom);

echo $xpath->evaluate("normalize-space(substring-after(., 'Property ID:'))");
Run Code Online (Sandbox Code Playgroud)

那么我怎样才能使它只获得第一个结果

kjh*_*hes 4

您可以更改 XPath 表达式,以使用位置索引 ( )仅选择第一次出现p包含的字符串。Property ID:[1]

\n\n

例如,以下 XPath 表达式将仅选择直接包含字符串“Property ID:\”的第一个段落:

\n\n
(//p[contains(text(),\'Property ID:\')])[1]\n
Run Code Online (Sandbox Code Playgroud)\n\n

将其与您的请求放在一起,仅返回“Property ID:”后面的字符串,但不返回该P-000324字符串之外的任何内容:

\n\n
echo $xpath->evaluate("normalize-space(substring-before(substring-after((//p[contains(text(),\'Property ID:\')])[1], \'Property ID:\'), \'\xe2\x80\x93\'))");\n
Run Code Online (Sandbox Code Playgroud)\n\n

将按P-000324要求回显。

\n\n

更新:这解决了原始页面最初呈现的问题,但根据评论,目标似乎更广泛。更可靠的解决方案是仅使用第一个表达式来获取包含“属性 ID”的第一段的字符串,然后在属性 id 的正常形式或周围分隔符的正常形式上的标签后立即进行正则表达式模式匹配属性 ID。您必须使用托管语言的正则表达式工具,因为 XPath 1.0 的字符串处理功能非常有限;XPath 2.0 的性能要好得多,并且包含正则表达式功能。

\n

  • @BenSwinburne 是正确的。在第二种情况下,“Property ID”后面的“:”周围有一个空格和一个单独的标记。后面的 id 也不在“-”之前。你现在真的在问一个新问题。如果您想在给定这些变化的情况下制定最通用的解决方案,您可能应该使用 XPath 1.0 来定位整个第一个字符串,如我所示,然后使用 PHP 的正则表达式模式匹配来查找“Property”之后的第一个数字字符串ID”子字符串。这将更加稳健,但正如本指出的那样,仍然不能保证完美。 (2认同)