[英]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*
表示將以B
或C
開頭的字符串,然后可能會跟隨一些空格。
由於我在用手機,所以我無法測試它,但是使用這種模式,您在$ 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.