preg_match_all
を使用して返される一致の数を制限する方法はありますか?preg_match_allを使用して結果の数を制限するPHP
たとえば、Webページの最初の20個の<p>
タグだけを一致させたいのですが、100個の<p>
タグがあります。
乾杯
preg_match_all
を使用して返される一致の数を制限する方法はありますか?preg_match_allを使用して結果の数を制限するPHP
たとえば、Webページの最初の20個の<p>
タグだけを一致させたいのですが、100個の<p>
タグがあります。
乾杯
いいえ、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;
}
$matches = array();
preg_match_all ($pattern , $subject , $matches);
$twenty = array_slice($matches , 0, 20);
ただ、すべてが一致し、結果の配列スライス:
$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
私は考えていたことを喜んでいる。 – Franco
私はそうは思わないが、しかし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];
}
}
。大きな文字列をスキャンする費用が懸念される場合は、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
ループよりも明確にされているだろう。)
乾杯ガンボこのDOMのものは本当に便利です。 HTMLでreg exの代わりにそれを使用しようとしたことはありません。 – Franco
@SiQ:* DOMDocument *はW3Cで指定されているようにDOMを実装しているため、かなり広範囲です。 DOMを読むだけでよい場合は、[* SimpleXML *](http://php.net/book.simplexml)でも試してみてください。 – Gumbo
あなたのDOMDocumentソリューションは、実際にコードを制限していますか?制限は設定されませんが、収集した余分なタグは無視されます。 – bozdoz