簡體   English   中英

類的正則表達式重復

[英]Regular Expression repetition of class

我試圖找出以下正則表達式:

<tr class="A">.*</tr><tr class="(B|C)">.*</tr>

現在,第二個tr類將重復未知的次數,在重復之間有未知的次數,但是僅將其放在括號中並添加一個加號是行不通的。

這是無效的PHP代碼:

$pattern = '/<tr\ class=\"A\">.*(<tr\ class=\"(B|C)\">.*<\/tr>.*)+/';
preg_match_all($pattern,$playerHtml,$scores);

但是它只返回第一個

這是一些應該匹配的示例:

<tr class="A">blah</tr>blah
<tr class="B">blah</tr>blah
<tr class="B">blah</tr>blah
<tr class="C">blah</tr>

這只匹配blahblahblah

對於您的特定示例,此正則表達式將執行以下操作:

/<tr class="A">.*?<\/tr>.*\n?(<tr class="[BC]">.*?<\/tr>.*\n?)+/

希望您可以根據需要進行調整。 此處查看鍵盤演示。

我需要包含\\n換行符才能正常工作。

因為它們是TABLE元素之外的TR元素,所以我很難看到preg_match_all函數的結果(因為我的瀏覽器立即刪除了隨機TR元素)。 您可能有類似的問題。 我在演示中使用了htmlspecialchars()輸出正則表達式匹配項。

另外 ,在兩個TR元素之間添加文本也是不適當的:

<tr></tr>blah<tr></tr>

因此,您應該謹慎操作。

嘗試:

 <tr class="A">.*</tr><tr class="((B|C)\s*)+">.*</tr>

+表示1次以上, *表示0次以上。 \\s表示空格。

((B|C)\\s*)+表示將存在一個或多個(B|C)\\s*

(B|C)\\s*表示將以BC開頭的字符串,然后可能會跟隨一些空格。

由於我在用手機,所以我無法測試它,但是使用這種模式,您在$ scores中得到什么?

<tr class="A">.*</tr><tr class="((B)|(C)|[^"]+)+">.*</tr>

preg_match_all將多次查找整個模式。

因為只被發現一次(我假設因為開始僅在$playerHtml一次),所以您只會得到一個匹配項。

相反,請先查找整個模式並提取您感興趣的部分,然后繼續該部分:

$pattern = '/<tr\ class=\"A\">.*(<tr\ class=\"(B|C)\">.*<\/tr>.*)+/';
$r = preg_match($pattern, $playerHtml, $matches);
if (FALSE === $r) throw new Exception('Regex failed.');

list(,$scoreHtml) = $matches;

$r = preg_match_all('/(<tr\ class=\"(B|C)\">.*<\/tr>.*)/', $scoreHtml, $scores);
if (FALSE === $r) throw new Exception('Regex failed.');

這段代碼很快被編寫出來,並且肯定不會起作用,僅用於說明您需要執行多個步驟。

但是,如果您使用的是HTML解析器而不是正則表達式,那么我敢打賭,通過一些小的xpath查詢,可以更快地獲得您想要的值:

//tr[@class="B" or @class="C"]

這將選擇所有具有您要查找的類的<tr>元素。 容易得多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM