私は、拡張PHPスクリプトに次の正規表現はPHPのpreg_match_all()を使って関数正規表現が失敗するのはなぜですか?
$total_matches = preg_match_all('{
<a\shref="
(?<link>[^"]+)
"(?:(?!src=).)+src="
(?<image>[^"]+)
(?:(?!designer-name">).)+designer-name">
(?<brand>[^<]+)
(?:(?!title=).)+title="
(?<title>((?!">).)+)
(?:(?!"price">).)+"price">\$
(?<price>[\d.,]+)
}xsi',$output,$all_matches,PREG_SET_ORDER);
この正規表現は、PHPを経由して(以下または小文字を区別しない場合に設定された同じオプションで(regexr.comでパーサーを使用して解析する際に正常に動作するようしています、御馳走行が空白と壊れる):
<a href="http://www.mytheresa.com/us_en/dordogne-120-sandals.html" title=
"DORDOGNE 120 PLATEAU SANDALEN" class="product-image">
<img class="image1st" src= "http://mytheresaimages.s3.amazonaws.com/catalog/product/cache/common/product_114114/small_ image/230x260/9df78eab33525d08d6e5fb8d27136e95/P/0/P00027794-DORDOGNE-120-PLATEAU-SANDALEN-STANDARD.jpg"
width="230" height="260"
alt= "Christian Louboutin - DORDOGNE 120 SANDALS - mytheresa.com GmbH"
title= "Christian Louboutin - DORDOGNE 120 SANDALS - mytheresa.com GmbH" />
<img class="image2nd" src= "http://mytheresaimages.s3.amazonaws.com/catalog/product/cache/common/product_114114/image/230x260/9df78eab33525d08d6e5fb8d27136e95/P/0/P00027794-DORDOGNE-120-PLATEAU-SANDALEN-DETAIL_2.jpg"
width="230" height="260" alt=
"Christian Louboutin - DORDOGNE 120 SANDALS - mytheresa.com GmbH" title=
"Christian Louboutin - DORDOGNE 120 SANDALS - mytheresa.com GmbH" /> <span class=
"availability"><strong>available sizes</strong><br /></span></a>
<div style="margin-left: 2em" class="available-sizes">
<h2 class="designer-name">Christian Louboutin</h2>
<div class="product-buttons">
<div class="product-button">
NEW ARRIVAL
</div>
<div class="clearer"></div>
</div>
<h3 class="product-name"><a href=
"http://www.mytheresa.com/us_en/dordogne-120-sandals.html" title=
"DORDOGNE 120 SANDALS">DORDOGNE 120 SANDALS</a></h3>
<div class="price-box">
<span class="regular-price" id="product-price-114114"><span class=
"price">$805.00</span></span>
</div>
私は行のいくつかの試合を解析しようとすると、それはまた、正常に動作し、私はこれらの試合から来る全ページを解析しようとすると、しかし、(私が持っています。同行の許可これは)
http://www.mytheresa.com/us_en/new-arrivals/what-s-new-this-week-1.html?limit=12
正規表現は失敗します(実際には500エラーが発生します)。
ini_set('pcre.backtrack_limit',100000000);
ini_set('pcre.recursion_limit',100000000);
を使用してバックトラック制限を引き上げようとしましたが、これで問題は解決しません。私はそれが有効であると思われる正規表現をPHP経由で失敗させる原因となっている間違って何をしているのだろうと疑問に思って、関連するページでコードを一致させます。それに手を加えることは、ページの長さと関連して否定的な先読みが問題を引き起こしていると示唆しているように思われますが、どうやってそれらを取り締まったのか分かりません。私はPHP 5.2.17を実行しています。
としての地位を提示し、そこにコンテンツを使用する許可を持って使用することができますか? –
'PCRE_VERSION'定数もチェックしてください。合理的な時代遅れの場合は、更新された 'libpcre'をインストールしてみてください。 '(?!..)。+)'アサーションはおそらく高価です。正規表現を修正したり、preg_replace_callbackに分割したりしたくない場合は、phpQueryやQueryPathのようなhtmlツールキットを使用して抽出することができます(容易に、またしばしば遅くはない)。 – mario
@mario私のPCRE_VERSIONは8.02 2010-03-19です。古いものとして認定されているかどうかは分かりません(4バージョンが古いです)。私は正規表現を修正する必要があるかもしれないと思う。先読みは高価だと私は驚いていますが、あなたはおそらく正しいと思います。正規表現を書き直すことができない場合は、phpQueryとQueryPathを調べます。 – jela