2015-07-12 68 views
3

我試圖捕捉看起來像這樣的元素表中的文本:通配符匹配不添加到陣列preg_match_all

<span id="ctl00_MainContent_ListView2_ctrl2_ctl01_Label17" class="vehicledetailTable" style="display:inline-block;width:475px;">OWNED</span><br />            

preg_match_all樣子:

preg_match_all('~475px;">(.*?)</span><br />~', $ret, $vehicle); 

問題是頁面上還有其他表格也匹配,但數據與我的查詢無關。我想都在數據「ListView2」,但「ct101_Label17」變化 - Label18,Label19,Label20等

因爲我不感興趣捕獲標籤,有沒有一種方法匹配主題字符串而不捕獲匹配?東西沿線:

<span id="ctl00_MainContent_ListView2_ctrl2_ctl01_[**WILDCARD HERE**]" class="vehicledetailTable" style="display:inline-block;width:475px;">OWNED</span><br />  

任何幫助將不勝感激。

+2

你應該使用'DOM'而不是正則表達式 – anubhava

+1

你可能想在這裏使用某種形式的html解析庫而不是正則表達式。用正則表達式解決這個問題是可能的,但是你處於危險區域,正則表達式可能會導致一些細微的邊緣情況錯誤,這是識別和調試的噩夢。 –

+0

我認爲你的通配符是[non](http://www.regular-expressions.info/charclass.html#negated) - 引用? '[^「] +'[參見regex101](https://regex101.com/r/jH6cP8/1) –

回答

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在這種情況下非常有用。

+1

這種方法非常出色,比我在做的方式更好。謝謝! –