【发布时间】:2015-10-17 20:32:45
【问题描述】:
我正在使用Simple HTML Dom Parser 从网页中抓取脚本标签,然后尝试使用 preg_match_all() 从所述标签中解析某些数据。但是,当我打印 preg_match_all 时,没有返回任何结果。
下面是我正在使用的代码:
<head>
<?php
require_once "toolkit/http.php";
require_once "toolkit/web_browser.php";
require_once "toolkit/simple_html_dom.php";
?>
</head>
<body>
<?php
$prod_url = 'http://www.domain.com/subpage.html';
$html = file_get_html($prod_url);
$script = $html->find('script', 17);
//echo $script;
preg_match_all('(?<=\d":)\w++', $script, $matches);
print_r($matches);
?>
</body>
我可以看到 HTML Simple Dom 代码工作正常,因为我在回显 $script 变量时得到了我期望的结果。结果是:
<script type="text/javascript">
var PRODUCT_JSON = {
"Def":{
"default":202705111,
"Listing:[{
"label":"Includes",
"options":[
{label:"All", id: "884"},
{label:"None", id: "485"},
]
}],
"Lookup":{
"1":202705111,
"0":202493236
}
}
};
</script>
因此,问题似乎与我在 preg_match_all() 中使用的正则表达式有关。正则表达式的目标是返回脚本标签末尾附近的两个数字 202705 和 202493。它可能与转义双引号或括号有关,尽管我也尝试过 preg_match_all('\(?<=\d\":\)\w++', $script, $matches); 得到相同的结果。关于我做错了什么有什么想法吗?
【问题讨论】:
-
将您的正则表达式写为
'#(?<=\d":)\w++#'。#是分隔符(您可以将其更改为/或@或%以避免转义它们)。 -
您是否有理由不使用 JSON 解析器 (json_decode())? (顺便说一句 preg_match_all('/(?:"\d":\s*)\w++/'....) 似乎对我有用)
-
@nhahtdh 谢谢!分隔符正是我所需要的。
-
@symcbean:您需要先提取文本,然后才能使用 JSON 解析器。为此需要一个 JS 解析器。
-
@symcbean 没有特别的原因,我只是不熟悉 json 解析器。考虑到我现在的上述代码按预期工作,使用它有什么特别的好处吗?
标签: javascript php regex preg-match preg-match-all