Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
正则表达式、php、preg_匹配_Php_Regex_Preg Match - Fatal编程技术网

正则表达式、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,只需跳到它包含英里数的部分即可