2010-12-17 167 views

回答

4

沒有,preg_match_all結果集的計算不能是有限的。您只能array_slicearray_splice限制的結果之後(這可能需要PREG_SET_ORDER):

preg_match_all($pattern, $subject, $matches, PREG_SET_ORDER); 
$firstMatches = array_slice($matches, 0, 20); 

但除此之外,你不應該使用正則表達式反正解析HTML。雖然現代的正則表達式引擎不再是常規的,並且可以處理像HTML這樣的不規則語言,但它很容易出錯。更好地使用適當的HTML解析器,而不是像PHP’s DOM library之一那樣。然後,只需使用一個計數器只得到了20場比賽:

$doc = new DOMDocument(); 
$doc->loadHTML($code); 
$counter = 20; 
$matches = array(); 
foreach ($doc->getElementsByTagName('p') as $elem) { 
    if ($counter-- <= 0) { 
     break; 
    } 
    $matches[] = $elem; 
} 
+0

乾杯濃湯,這個DOM東西真的很有用。從來沒有嘗試過使用它,而不是使用reg ex ex,所以它會一試! – Franco 2010-12-17 11:21:40

+0

@SiQ:請注意,* DOMDocument *按照W3C的規定實現了DOM,因此是相當廣泛的;如果你只需要讀取DOM,你也可以嘗試[* SimpleXML *](http://php.net/book.simplexml)。 – Gumbo 2010-12-17 11:24:52

+0

您的DOMDocument解決方案在事實之後限制了代碼,不是嗎?它沒有設置限制,但忽略了它收集的額外標籤。 – bozdoz 2011-08-20 05:38:00

3
$matches = array(); 
preg_match_all ($pattern , $subject , $matches); 
$twenty = array_slice($matches , 0, 20); 
3

只是匹配所有,切片結果數組:

$allMatches = array(); 
$numMatches = preg_match_all($pattern, $subject, $allMatches, PREG_SET_ORDER); 
$limit = 20; 
$limitedResults = $allMatches; 
if($numMatches > $limit) 
{ 
    $limitedResults = array_slice($allMatches, 0, $limit); 
} 

// Use $limitedResults here 
+0

乾杯朋友,這是我考慮過的方式。 – Franco 2010-12-17 11:22:15

0

我不這麼認爲,但preg_match確實有一個offset參數,還有一個PREG_OFFSET_CAPTURE標誌,這些標誌在組合時可用於獲得「下一個匹配」。

這是,如果你不想讓所有的結果主要是有用的,然後array_slice()部分關閉:O)

編輯: 好吧,這裏是一些代碼(不是測試或以任何方式使用):

$offset = 0; 
$matches = array(); 
for ($i = 0; $i < 20; $i++) { 
    $results = preg_match('/<p(?:.*?)>/', $string, PREG_OFFSET_CAPTURE, $offset); 
    if (empty($results)) { 
     break; 
    } else { 
     $matches[] = $results[0][0]; 
     $offset += $results[0][1]; 
    } 
} 
0

您可以使用preg_match_all()並放棄您不感興趣的匹配,也可以使用preg_match()的循環。如果您擔心掃描大字符串的費用,第二種選擇會更好。

該實施例限制到2點的匹配,當存在整個串中實際上是3:

<?php 

$str = "ab1ab2ab3ab4c"; 

for ($offset = 0, $n = 0; 
     $n < 2 && preg_match('/b([0-9])/', $str, $matches, PREG_OFFSET_CAPTURE, $offset); 
     ++$n, $offset = $matches[0][1] + 1) { 

     var_dump($matches); 
} 

真的一個while環路可能早就比for環上的反射更清晰;)