-1

以下の html から part#1AMTB00186 の各インスタンスの特定の修飾子を取得しようとしています。戻る必要が4cyl 2.3L - F23A1, Balance Shaftあり4cyl 2.3L - F23A1, CAMます。私の正規表現は貪欲だと思いますが、貪欲でないようにする方法がわかりません。の最初の修飾子が常に表示されます2.3L L4, Engine-F23A1。私は使っている:

partno="1AMTB00186";

$pattern_short ='{<td\s+class="qualifier"\s*>.*<div>([^<]+)</div>.*' . $partno . '}sU';
$matchcount = preg_match_all($pattern_short, $data, $matches);
<tr>
<tr id="61" class="findme">
<td class="productName">
<h3>Air and Fuel Delivery - Fuel Pumps and Related Components</h3>
<br>Electric Fuel</td>
<td class="qualifier"><div>2.3L L4, Engine-F23A1</div></td>
<td class="partNum">1AMFP00020</td>
</tr>
<tr id="62" class="odd findme">
<td class="productName">
<h3>Air and Fuel Delivery - Fuel Pumps and Related Components</h3>
<br>Electric Fuel</td>
<td class="qualifier"><div>3.0L V6, Engine-J30A1</div></td>
</tr>
<tr id="63" class="findme">
<td class="productName">
<h3>Belts - Timingbelts</h3>
<br>Timingbelt</td>
<td class="qualifier"><div>4cyl 2.3L - F23A1, Balance Shaft</div></td>
<td class="partNum">1AMTB00186</td>
</tr>
<tr id="64" class="odd findme">
<td class="productName">
<h3>Belts - Timingbelts</h3>
<br>Timingbelt</td>
<td class="qualifier"><div>4cyl 2.3L - F23A1, CAM</div></td>
<td class="partNum">1AMTB00244</td>
</tr>
</tr>
<tr id="63" class="findme">
<td class="productName">
<h3>Belts - Timingbelts</h3>
<br>Timingbelt</td>
<td class="qualifier"><div>4cyl 2.3L - F23A1, CAM</div></td>
<td class="partNum">1AMTB00186</td>
</tr>
<tr id="65" class="findme">
<td class="productName">
<h3>Belts - Timingbelts</h3>
<br>Timingbelt</td>
<td class="qualifier"><div>V6 3.0L - J30A1, CAM</div></td>
<td class="partNum">1AMTB00286</td>
</tr>
<tr id="66" class="odd findme">
<td class="productName">
<h3>Brakes - Disc Brake Pad and Hardware Kit</h3>
<br>Front; 7345-D465 Ceramic</td>
<td class="qualifier"><div>L4 2.3L</div></td>
<td class="partNum">1AMV300465</td>
</tr>

ありがとうございました

4

1 に答える 1

2

真剣に、正規表現を使用して HTML コードの大きなブロックを解析しようとするのはやめてください。それは仕事には不適切なツールです。

代わりに、PHP には完全に優れたDOM パーサーが組み込まれています。ここでそれを使用する方法についての本当に良い説明があります: how to use dom php parser (そして、あなたが見れば周りの多くのチュートリアル)。

要するに、次のようなものが必要です。

libxml_use_internal_errors(true);
$dom = new DOMDocument;
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$query = '//tr/td[@class="partNum" and text() = "1AMTB00186"]/preceding-sibling::td[@class="qualifier"]';
foreach ($xpath->query($query) as $qualifier) {
    echo $qualifier->nodeValue, PHP_EOL;
}

XPath は次のように$query説明しています。

TR 要素の直接の子であるクラス「partNum」およびコンテンツ「1AMTB00186」を持つ TD 要素の前にある、クラス「qualifier」を持つすべての TD 要素に一致します

XPath を記述する代替バリアントは次のようになります。

//tr/td[
    @class="qualifier" and following-sibling::td[
        @class="partNum" and text() = "1AMTB00186"
    ]
]
于 2013-05-03T13:28:42.330 に答える