regex — очистка JSON с переполнением стека

Я сделал много соскоб HTML с использованием Xpath. Но теперь я должен почистить JSON и не знаю, как это сделать. Источник, который я хочу очистить:

     {
"ASIN" : "B00DR4LYHY",
"FeatureName" : "price_feature_div",
"Type" : "JSON",
"Value" :
{
"content" :
{"price_feature_div":"<div id=\"price\" class=\"a-section a-spacing-small\">\n<table class=\"a-lineitem\">\n    \n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\n\n\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t    \n\t\t\t\t    \n\t\t\t\t    \n\t\t\t\t    \n\t\t\t\t    \n\t\t\t\t    \n\t\t\t\t        \n\t\t                \n\t\t                            \n\t\t\t\t        \n\t\t                \n\t\t\t\t        \n\n\n\n\n\n\t\n<tr>\n    <td class=\"a-color-secondary a-size-base a-text-right a-nowrap\">Price:<\/td>\n    <td class=\"a-span12\">\n        <span id=\"priceblock_ourprice\"
class=\"a-size-medium a-color-price\">$37.60<\/span>\n        \n\n\n\n        \n\n\n\n\n\n\n        \n\n        <span id=\"ourprice_shippingmessage\">\t\n        \t\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    \n        \n        \n        \n\n\t    \n\t\t\n\t\t\n        \n            <span class=\"a-size-base a-color-base\">& <b>FREE Shipping<\/b><\/span>\n        \n        \n    \n\n\n\n        <\/span>\n        \n        \n        \n        \n    <\/td>\n<\/tr>\n\n\t\t\t\t    \n\t\t\t\t    \n\t\t\t\t    \n\t\t\t\t    \n\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\n\t\t            \n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\n\t\t\t\n\t\t\t\n\n\n\n\n\t\t\t\n\t\t\t\n\n\t\t\t\n\t\t\t\n\t\t\t\t\n\n\n\n\n\n\n\t\t\t\n\n\t\t\t\n\t\t\t\n\n\t\t\t\n\t\t\t\n\n\n\n\n\n\t\t\t\n\t\t\t\n\n\t\t\n\t\n\t\n\t\n\n    \n    \n\t\n<\/table>\n<\/div>"}

}
}

Я получаю этот код от:

$URL    = 'http://www.amazon.com/gp/twister/ajaxv2?sid=188-4344403-7969026&ptd=OUTERWEAR&json=1&dpxAjaxFlag=1&sCac=1&isUDPFlag=1&twisterView=glance&ee=2&pgid=apparel_display_on_website&sr=1-3&nodeID=1036592&rid=0Q05FXGQJSA20X44DJVG&parentAsin=B00DR4LUQY&enPre=1&qid=1413775191&dStr=size_name%2Ccolor_name&auiAjax=1&storeID=apparel&psc=1&asinList=B00DR4LYHY&isFlushing=2&id=B00DR4LYHY&prefetchParam=0&mType=full&dpEnvironment=softlines';

То, что я должен получить, является ценой (37,60 $)

Код, который я использую, предоставленный Venkata:

    $URL    = 'http://www.amazon.com/gp/twister/ajaxv2?sid=188-4344403-7969026&ptd=OUTERWEAR&json=1&dpxAjaxFlag=1&sCac=1&isUDPFlag=1&twisterView=glance&ee=2&pgid=apparel_display_on_website&sr=1-3&nodeID=1036592&rid=0Q05FXGQJSA20X44DJVG&parentAsin=B00DR4LUQY&enPre=1&qid=1413775191&dStr=size_name%2Ccolor_name&auiAjax=1&storeID=apparel&psc=1&asinList=B00DR4LYHY&isFlushing=2&id=B00DR4LYHY&prefetchParam=0&mType=full&dpEnvironment=softlines';$page = file_get_contents($URL);
$decoded = json_decode($page);

$html = $decoded->Value->content->price_feature_div;$dom = new DOMDocument();
$dom->loadHTML($html);

$xpath = new DOMXPath($dom);

//frem dom method
$elements = $dom->getElementById("priceblock_ourprice")->item(0);

//OR use extract it from xpath like below line
$priceNode = $xpath->query("//*[@id='priceblock_ourprice']");

if (!is_null($elements)) {
//$priceNode = $elements->item(0);
$ourPrice = $priceNode;
echo $ourPrice;
}

Я думаю, что лучше всего использовать REGEX, но как должно выглядеть выражение?

0

Решение

Извлечение с помощью PHP

$json_string = '{"ASIN" : "B00DR4LYHY","FeatureName" : "price_feature_div","Type" : "JSON","Value" : {"content" : {"price_feature_div":"<div id=\"price\" class=\"a-section a-spacing-small\">\n<table class=\"a-lineitem\">\n    \n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\n\n\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t    \n\t\t\t\t    \n\t\t\t\t    \n\t\t\t\t    \n\t\t\t\t    \n\t\t\t\t    \n\t\t\t\t        \n\t\t                \n\t\t                            \n\t\t\t\t        \n\t\t                \n\t\t\t\t        \n\n\n\n\n\n\t\n<tr>\n    <td class=\"a-color-secondary a-size-base a-text-right a-nowrap\">Price:<\/td>\n    <td class=\"a-span12\">\n        <span id=\"priceblock_ourprice\" class=\"a-size-medium a-color-price\">$37.60<\/span>\n        \n\n\n\n        \n\n\n\n\n\n\n        \n\n        <span id=\"ourprice_shippingmessage\">\t\n        \t\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    \n        \n        \n        \n\n\t    \n\t\t\n\t\t\n        \n            <span class=\"a-size-base a-color-base\">& <b>FREE Shipping<\/b><\/span>\n        \n        \n    \n\n\n\n        <\/span>\n        \n        \n        \n        \n    <\/td>\n<\/tr>\n\n\t\t\t\t    \n\t\t\t\t    \n\t\t\t\t    \n\t\t\t\t    \n\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\n\t\t            \n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\n\t\t\t\n\t\t\t\n\n\n\n\n\t\t\t\n\t\t\t\n\n\t\t\t\n\t\t\t\n\t\t\t\t\n\n\n\n\n\n\n\t\t\t\n\n\t\t\t\n\t\t\t\n\n\t\t\t\n\t\t\t\n\n\n\n\n\n\t\t\t\n\t\t\t\n\n\t\t\n\t\n\t\n\t\n\n    \n    \n\t\n<\/table>\n<\/div>"}}}';

$decoded = json_decode($json_string);
$html = $decoded->Value->content->price_feature_div;

$dom = new DOMDocument();
$dom->loadHTML($html);

$xpath = new DOMXPath($dom);

//frem dom method
$elements = $dom->getElementById("priceblock_ourprice")->item(0);

//OR use extract it from xpath like below line
//$priceNode = $xpath->query("//*[@id='priceblock_ourprice']");

if (!is_null($elements)) {
$priceNode = $elements->item(0);
$ourPrice = $priceNode;
echo $ourPrice;
}

Извлечение во внешнем интерфейсе (Я использовал jQuery в приведенном ниже решении)

var jsonObj={
"ASIN" : "B00DR4LYHY",
"FeatureName" : "price_feature_div",
"Type" : "JSON",
"Value" :
{
"content" :
{"price_feature_div":"<div id=\"price\" class=\"a-section a-spacing-small\">\n<table class=\"a-lineitem\">\n    \n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\n\n\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t    \n\t\t\t\t    \n\t\t\t\t    \n\t\t\t\t    \n\t\t\t\t    \n\t\t\t\t    \n\t\t\t\t        \n\t\t                \n\t\t                            \n\t\t\t\t        \n\t\t                \n\t\t\t\t        \n\n\n\n\n\n\t\n<tr>\n    <td class=\"a-color-secondary a-size-base a-text-right a-nowrap\">Price:<\/td>\n    <td class=\"a-span12\">\n        <span id=\"priceblock_ourprice\" class=\"a-size-medium a-color-price\">$37.60<\/span>\n        \n\n\n\n        \n\n\n\n\n\n\n        \n\n        <span id=\"ourprice_shippingmessage\">\t\n        \t\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    \n        \n        \n        \n\n\t    \n\t\t\n\t\t\n        \n            <span class=\"a-size-base a-color-base\">& <b>FREE Shipping<\/b><\/span>\n        \n        \n    \n\n\n\n        <\/span>\n        \n        \n        \n        \n    <\/td>\n<\/tr>\n\n\t\t\t\t    \n\t\t\t\t    \n\t\t\t\t    \n\t\t\t\t    \n\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\n\t\t            \n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\n\t\t\t\n\t\t\t\n\n\n\n\n\t\t\t\n\t\t\t\n\n\t\t\t\n\t\t\t\n\t\t\t\t\n\n\n\n\n\n\n\t\t\t\n\n\t\t\t\n\t\t\t\n\n\t\t\t\n\t\t\t\n\n\n\n\n\n\t\t\t\n\t\t\t\n\n\t\t\n\t\n\t\n\t\n\n    \n    \n\t\n<\/table>\n<\/div>"}

}
};
//using jQuery we extracted the price
var ourPrice = $(jsonObj.Value.content.price_feature_div).find("#priceblock_ourprice").text();

console.log(ourPrice);//"$37.60" is the value you can see in the browser-console

Замечания: Я нашел синтаксическую ошибку в "price_feature_div" Значение html (в значении JSON оно должно быть в одной строке, даже если это строка HTML). Заметил два разрыва строки в HTML.

0

Другие решения

Я думаю, что лучше всего было бы использовать REGEX, но как должно выглядеть выражение

В некоторых случаях регулярное выражение работает лучше, чем xpath (для неструктурированных фрагментов HTML-текста ограниченного размера).

Таким образом, вы просто получаете сырые данные и придерживаться $ Вы получаете то, что хотите.

 $page = file_get_contents($URL);
$pattern = '/\$[\d.]+/';
$preg_match($page, $pattern, $matches);
echo 'price = ', $matches[0];

Увидеть рабочая демо.

0

По вопросам рекламы [email protected]