正则表达式、php、preg_匹配
我试图从不同的易趣页面中提取里程值,但我被卡住了,因为页面有点不同,所以似乎有太多的模式。因此,我想知道你是否可以帮助我一个更好的模式。 项目的一些示例如下:正则表达式、php、preg_匹配,php,regex,preg-match,Php,Regex,Preg Match,我试图从不同的易趣页面中提取里程值,但我被卡住了,因为页面有点不同,所以似乎有太多的模式。因此,我想知道你是否可以帮助我一个更好的模式。 项目的一些示例如下: 请查看下面链接中的模式(我仍然不知道如何在这里转义html) http://pastebin.com/zk4HAY3T http://pastebin.com/zk4HAY3T 但是,它们的数量还不够,因为似乎还有新的模式……这应该更通用一些-它不关心html标记中的内容。它适用于您提供的所有三个链接 /Mileage[^<]*&
请查看下面链接中的模式(我仍然不知道如何在这里转义html) http://pastebin.com/zk4HAY3T http://pastebin.com/zk4HAY3T
但是,它们的数量还不够,因为似乎还有新的模式……这应该更通用一些-它不关心html标记中的内容。它适用于您提供的所有三个链接
/Mileage[^<]*<[^>]*><[^>]*>(.*?)\s*miles/i
/里程[^]*>(.*)\s*英里/i
当然,根据您的其他约束条件,可能有更好的方法,但这是一个很好的起点
认识到存在重复,您可以(至少在逻辑上)进一步简化:
/Mileage[^<]*(?:<[^>]*>){2}(.*?)\s*miles/i
/milies[^){2}(.*)\s*英里/i
您正在单词“Milege”和“miles”之间的一行中查找两个html标记。这是(?:]*>){2}
部分。?:
告诉它不要记住那个序列,这样$matches[1]
仍然包含您要查找的数字,{2}
指示您要精确匹配前一个序列两次。。即使对于这样一件相对简单的事情,正则表达式也会使您高度依赖于精确的标记
您可以使用DOMDocument和XPath很好地获取值,并且它对页面中的更改具有更强的弹性:
$doc = new DOMDocument();
@$doc->loadHtmlFile($url);
$xpath = new DOMXpath($doc);
foreach ($xpath->query('//th[contains(., "Mileage")]/following-sibling::td') as $td) {
var_dump($td->textContent);
}
XPath查询搜索包含单词“miliner”的
,然后选择它后面的
然后,您可以去掉
miles
后缀,并使用str\u replace
或substr
删除逗号。我会在regexp上读更多内容,因为您的操作方式肯定会有所改进。它们都可以用一个正则表达式代替一个正则表达式来完成,您不应该试图匹配每个属性和tr,只需跳到它包含英里数的部分即可