所以我今天正在学习正则表达式和东西,我得到它的工作方式,但当我试图将它作为从网站获取数据的一部分时,它没有用。有趣的是,如果我回应我正在检索的原始html,然后手动将其作为字符串放入正则表达式,它工作正常。有谁知道为什么会这样? 这是代码:
preg_match_all('/<img src="images\/cms\/trinket\/(.*).png" \/><\/a>
<div style="width:85px; font-size:14px; font-weight:bold;
color:#731c08;">(.*)<\/div>/iU', snd('test.php'),
$matches, PREG_SET_ORDER);
snd是一个函数,curl返回可能导致问题的数据,但我不知道。
snd功能:
function snd($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://whatever.com/'.$url);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1468.0 Safari/537.36');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
示例(为了可读性添加了换行符):
<div style="width:600px; margin-left:auto; margin-right:auto; text-align:center; position:relative; z-index:1;">
<span style="display:inline-block; width:85px; height:100px;">
<a rel="includes/itemajax.php?id=789&tab=trinket" class="clue">
<img src="images/cms/trinket/789.png" /></a>
<div style="width:85px; font-size:14px; font-weight:bold; color:#731c08;">4</div>
</span> <span style="display:inline-block; width:85px; height:100px;">
<a rel="includes/itemajax.php?id=891&tab=trinket" class="clue">
<img src="images/cms/trinket/891.png" /></a>
<div style="width:85px; font-size:14px; font-weight:bold; color:#731c08;">3</div> </span>
应该返回:789,4和891,3
答案 0 :(得分:1)
将正则表达式与示例文本进行比较后,问题似乎是示例文本本身的“空白”。
例如,img src=
将不匹配,但如果您将其更改为img[\s]+src=
,则会。{/ p>
如果您在整个正则表达式中添加此更改,则最终应该:
<img[\s]+src="images\/cms\/trinket\/(.*).png"[\s]+\/><\/a>[\s\r\n]+<div[\s]+style="[^"]+">(.*)<\/div>
如果您想将模式拆分为多行以便于阅读,您还可以使用x
标志来“忽略模式空白”:
preg_match_all('/<img[\s]+src="images\/cms\/trinket\/(.*).png"[\s]+\/><\/a>[\s\r\n]+
<div[\s]+style="[^"]+">(.*)<\/div>
/iUx',
snd('test.php'), $matches, PREG_SET_ORDER);
注意:我还将div属性中的style
值列表更新为[^"]+
,因为完整列表相当长且不必要;如果需要,您可以随时添加它们。