PHP / HTML DOM Parser - 从文本中获取特定部分,然后获取另一个字符串

时间:2015-03-31 14:09:14

标签: php

伙计们我正在开发一个脚本,该脚本从curl链接解析HTML输出数据。

这是HTML DOM解析器 - http://simplehtmldom.sourceforge.net

让我告诉你我的解析器:

<?PHP
include_once('./simple_html_dom.php');
$url = "http://www.sportsdirect.com/muddyfox-cycling-short-sleeved-jersey-mens-636266?colcode=63626622";
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSLVERSION, 3);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');
 $str = curl_exec($curl);  
 curl_close($curl); 

$html= str_get_html($str);   


$SIZEID = 'UK: 8-13 Kids / EU: 25-32 Kids';
$occurencies = preg_match_all('/(?<=\"SizeName\":\"' . preg_quote($SIZEID, "/") . '")\S+/i', $str, $match);


foreach($html->find('#ulColourImages li') as $selectnocolor)    
$colvarid = $selectnocolor->colvar-id;
$tooltiptext = $selectnocolor->tooltiptext;     


echo "$tooltiptext - $colvarid";

因此,当我获取我需要的页面时,我会得到纯文本,我必须从中获取特定部分。

以下是完整文字:http://pastebin.com/FwK9Z8CP

让我描述一下我的需求。

在文本中,此特定单词ColVarId共出现3次。

ColVarId后,有几个"SellPrice":"PRICEHERE"

例如,在文字"SellPrice":"£4.49"中,此SellPrice字词会向我提供有关价格的信息。这就是我想要在决赛中取得的成就,我希望得到特定"SellPrice":"MYTargetText"

中包含的价格

我想做什么,但不知道如何:

例如,我希望在第二次出现ColVarId单词之后获取所有文本,然后从我想要选择的提取文本中选择例如SellPrice的第三次出现,其结构类似例如"SellPrice":"£4.49",在此示例中价格为4.49。 所以我想得到那里的价格。我该怎么做?

我希望我能很好地描述我的问题,并且你理解我想要在决赛中取得的成就。

提前致谢。

4 个答案:

答案 0 :(得分:2)

由于这是php,如何使用json_decode呢?虽然正则表达式看起来很可靠,但如果将来需要,json_decode将更加可靠,并提供更多功能来访问对象中的其他属性。

在下面的解决方案中,我使用preg_replace在字符串的开头字符串输出javaScript。然后我解码剩下的json,所以我将数据作为对象。

$colourJavascript = preg_replace('/^[^=]+=/', '', $colourJavascript);

$data = json_decode($colourVariantsInitialData);

print_r($data[0]->SizeVariants[0]->ProdSizePrices->SellPrice);
print_r($data[0]->SizeVariants[1]->ProdSizePrices->SellPrice);
print_r($data[0]->SizeVariants[2]->ProdSizePrices->SellPrice);

如果您需要数值,而不是样本数据中格式化的货币,您可以使用NumberFormatter来提取值。

$formatter = new NumberFormatter("en-GB", \NumberFormatter::CURRENCY);
$priceRaw = $data[0]->SizeVariants[0]->ProdSizePrices->SellPrice;

print_r($formatter->parse($priceRaw)); 

<强> Full Gist

答案 1 :(得分:1)

您在Pastebin上链接的示例看起来像JavaScript,而不是HTML。完全不同的语言。你绝对不应该使用正则表达式来解析PHP原生支持的数据格式。

理想情况下,它应该在JavaScript中解析。如果你必须在PHP中解析它,然后剥离JavaScript部分(开头是var colourVariantsInitialData=,最后是分号),然后使用{将JSON部分插入到PHP数组中{3}}。例如:

<?php

$s = file_get_contents("http://example.com/path/to/data.json");

preg_match('/^[^=]+ *= *(.*);$/', $s, $a);

$output = json_decode($a[1]);

// Now simply go find SellPrice inside ColVarId.

答案 2 :(得分:1)

首先尝试避免simple_html_dom,这是有史以来最差的解析器(最慢)而不是那么简单。花点时间学习如何使用DOMDocument和DOMXPath(有大量关于XPath 1.0的教程)来做同样的工作(请注意,一旦你学会了php,你就可以将它用于很多其他语言了这是随处可见的。)

第二步是提取json字符串并构建一个json对象。

一般建议:当你使用这种格式在鼻子下形成数据时,它比字符串方法更方便。

$url = 'http://www.samplehost.com/samplepage.php';

// discard notices and warnings about badly formated html 
libxml_use_internal_errors(true);
$dom = new DOMDocument; 
// or get the file content via curl and use $dom->loadHTML($content);
$dom->loadHTMLFile($url); 

$xp = new DOMXPath($dom);
// '//' means everywhere in the DOM tree, 'script' is the target node,
// and [...] encloses conditions about this node:
// normalize-space is used here to trim leading spaces,
// the dot refers to the current node content
$qry = '//script[starts-with(normalize-space(.), "var colourVariantsInitialData")]';

// an xpath query returns a nodeList, to get the first (and unique here)
// item of the list, you need to use ->item(0)
$rawtxt = $xp->query($qry)->item(0)->nodeValue;

// extraction of the json string and creation of a json object 
$jsonStart = strpos($rawtxt, '[');
$jsonEnd = strrpos($rawtxt, ']');

$collections = json_decode(substr($rawtxt, $jsonStart, $jsonEnd - $jsonStart + 1));

// Then you can easily extract what you want from the json object 
echo "collection id: " . $collections[1]->ColVarId . "\n";

foreach ($collections[1]->SizeVariants as $item) {
    printf("%-30s\t%s\n", $item->SizeName, $item->ProdSizePrices->SellPrice);
}

答案 3 :(得分:0)

免责声明:这只适用于PHP,并且只有在您真正要使用正则表达式进行解析时才能使用。

这是你的正则表达式,提取3“SellPrice”:“”字符串:

 ColVarId.*?\K("SellPrice":"[^"]+")

这是demo

在PHP中使用\K是可能的,因为它使用PCRE库。 \K省略了与此运算符匹配的整个匹配项。并且您收到了SellPrice的详细信息。