1

我需要在网页脚本中提取一个 json 对象。这是网页的一部分:

<html>
<script>
    .....
</script>
<script type=\"text/javascript\">
    $(function(){



        $(\"#map5\").gMap({ maptype: G_SATELLITE_MAP,
        controls: false,
                  scrollwheel: false,

                  markers: [

{.....},{......},],

latitude: 24.70115790054175,
longitude: 46.04358434677124,
zoom: 5
});

});
</script>
</head>
<body>
    ....
</body>
</html>

我想提取以 wit 开头的 JSON 对象{ maptype:。我想到了使用regular expression方法来实现这一点。这是我所做的:

$html = file_get_contents($url);
$regex_pattern = "/\<script.*/";
preg_match_all($regex_pattern,$html,$matches);

但是,我的模式似乎只选择对象的第一行!我想不出一种让它选择所有对象的方法。

任何帮助将不胜感激。

4

2 回答 2

1

Elsalamoe 3aleikom :D

这是你如何做到的:

$script = <<<FIL
<script type=\"text/javascript\">
    $(function(){



        $(\"#map5\").gMap({ maptype: G_SATELLITE_MAP,
        controls: false,
                  scrollwheel: false,

                  markers: [

{.....},{......},],

latitude: 24.70115790054175,
longitude: 46.04358434677124,
zoom: 5
});

});
</script>
FIL;

preg_match_all('/<script[^>]*>.*?\.gMap\(\s*({.*?})\);.*?<\/script>/mis', $script, $m);
var_dump($m[1]);

在线演示和解释

于 2013-04-26T21:01:23.057 回答
0

你的模式失败的原因是点.不匹配换行符,如果你想要它,你必须s在你的模式末尾添加修饰符。多行模式(m 修饰符)在这里没有用。

试试这个:

$json = (preg_match('~\.gMap\s*+\(\s*+\K\{.+?\}(?=\s*+\)\s*+;)~s', $html, $result))?
    $result[0] : false;
于 2013-04-26T22:25:53.897 回答