2010-12-17 19 views

答えて

4

いいえ、preg_match_all結果セットの計算を制限することができません。

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

しかし、それ以外にも、あなたはとにかくHTMLを解析するために正規表現を使用しないでください:あなただけ array_sliceまたは array_splice(これは PREG_SET_ORDERを必要とする)と、その後の結果を制限することができます。現代の正規表現エンジンはもはや規則的ではなく、HTMLのような不規則な言語を処理することができますが、あまりにもエラーを起こしやすいです。 PHP’s DOM libraryのような適切なHTMLパーサーを使用する方がよいでしょう。それからちょうどカウンターを使用するだけで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のものは本当に便利です。 HTMLでreg exの代わりにそれを使用しようとしたことはありません。 – Franco

+0

@SiQ:* DOMDocument *はW3Cで指定されているようにDOMを実装しているため、かなり広範囲です。 DOMを読むだけでよい場合は、[* SimpleXML *](http://php.net/book.simplexml)でも試してみてください。 – Gumbo

+0

あなたのDOMDocumentソリューションは、実際にコードを制限していますか?制限は設定されませんが、収集した余分なタグは無視されます。 – bozdoz

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

0

私はそうは思わないが、しかしpreg_match持っていませんoffsetパラメータ、およびPREG_OFFSET_CAPTUREフラグを組み合わせて使用​​すると、「次の一致」を得ることができます。

あなたはすべての結果、その後array_slice()部分下車したくない場合は、主に有用である:Oを

EDIT): [OK]を、ここでいくつかのコード(テストまたは任意の方法で使用されていない)です。

はあなたは preg_match_all()を使用し、あなたに興味を持っていないなら、あるいはあなたが preg_match()でループを使用することができます一致を破棄するか
$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

。大きな文字列をスキャンする費用が懸念される場合は、2番目のオプションを使用する方が良いでしょう。

3は、文字列全体に実際に存在する2試合、この例の制限:本当に

<?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ループよりも明確にされているだろう。)

関連する問題