匹配通配符而不使用preg_match_all添加到数组

时间:2015-07-12 11:04:58

标签: php html regex preg-match-all

我试图从一个看起来像这样的元素中捕获表文本:

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);

非常感谢任何帮助。

1 个答案:

答案 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 - 获取
  • 的所有span标记
  • starts-with(@id,'ctl00_MainContent_ListView2_ctrl2_ctl01_') - 属性id,其值为ctl00_MainContent_ListView2_ctrl2_ctl01_
  • @class='vehicledetailTable' - 并且class属性的值等于vehicledetailTable
  • contains(@style,'475px;') - 并且style属性的值包含475px;

条件包含在[...]中,并与orand结合使用。它们也可以用圆括号分组。您也可以使用not(...)来反转条件。在这种情况下,XPath非常有用。