我试图从一个看起来像这样的元素中捕获表文本:
OnImages
我的 preg_match_all 如下所示:
<span id="ctl00_MainContent_ListView2_ctrl2_ctl01_Label17" class="vehicledetailTable" style="display:inline-block;width:475px;">OWNED</span><br />
问题是页面上还有其他表格也匹配,但数据与我的查询无关。我想要的数据都在&#34; ListView2 ,&#34;但&#34; ct101_Label17 &#34;各种不同 - Label18,Label19,Label20等。
由于我对捕获标签不感兴趣,是否有一种方法可以匹配主题字符串而不捕获匹配?有点像:
preg_match_all('~475px;">(.*?)</span><br />~', $ret, $vehicle);
非常感谢任何帮助。
答案 0 :(得分:3)
这是您目前正在考虑的一个非常糟糕的解决方案:
<span\b[^<>]*\bid="ctl00_MainContent_ListView2_ctrl2_ctl01_[^"]*"[^<>]*475px;">(.*?)</span><br\s*/>
请参阅demo
确保我们找到<span>
标记,id
属性以ctl00_MainContent_ListView2_ctrl2_ctl01_
开头,并且有一些属性(您知道它是style
)结束使用475px;
,然后我们只捕获截止</span>
标记的所有内容。
你可以使用DOM和XPath来获得这个,这是一个更安全的解决方案,使用与上面相同的逻辑:
$html = "<span id=\"ctl00_MainContent_ListView2_ctrl2_ctl01_Label17\" class=\"vehicledetailTable\" style=\"display:inline-block;width:475px;\">OWNED</span><br />";
$dom = new DomDocument();
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$spans = $xpath->query("//span[starts-with(@id,'ctl00_MainContent_ListView2_ctrl2_ctl01_') and @class='vehicledetailTable' and contains(@style,'475px;')]");
$data = array();
foreach ($spans as $span) {
array_push($data, $span->textContent);
}
print_r($data);
输出:[0] => OWNED
请注意,XPath表达式包含3个条件,可以随意修改:
//span
- 获取starts-with(@id,'ctl00_MainContent_ListView2_ctrl2_ctl01_')
- 属性id
,其值为ctl00_MainContent_ListView2_ctrl2_ctl01_
@class='vehicledetailTable'
- 并且class
属性的值等于vehicledetailTable
contains(@style,'475px;')
- 并且style
属性的值包含475px;
。条件包含在[...]
中,并与or
或and
结合使用。它们也可以用圆括号分组。您也可以使用not(...)
来反转条件。在这种情况下,XPath非常有用。