我试图使用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)
那么我怎样才能使它只获得第一个结果?
您可以更改 XPath 表达式,以使用位置索引 ( )仅选择第一次出现p
包含的字符串。Property ID:
[1]
例如,以下 XPath 表达式将仅选择直接包含字符串“Property ID:\”的第一个段落:
\n\n(//p[contains(text(),\'Property ID:\')])[1]\n
Run Code Online (Sandbox Code Playgroud)\n\n将其与您的请求放在一起,仅返回“Property ID:”后面的字符串,但不返回该P-000324
字符串之外的任何内容:
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
要求回显。
更新:这解决了原始页面最初呈现的问题,但根据评论,目标似乎更广泛。更可靠的解决方案是仅使用第一个表达式来获取包含“属性 ID”的第一段的字符串,然后在属性 id 的正常形式或周围分隔符的正常形式上的标签后立即进行正则表达式模式匹配属性 ID。您必须使用托管语言的正则表达式工具,因为 XPath 1.0 的字符串处理功能非常有限;XPath 2.0 的性能要好得多,并且包含正则表达式功能。
\n