[英]PHP Regular Expression - Repeating Match of a Group
我有一個字符串可能看起來像這樣:
$r = 'Filed under: <a>Group1</a>, <a>Group2</a>';
這是我到目前為止使用的正則表達式:
preg_match_all("/Filed under: (?:<a.*?>([\w|\d|\s]+?)<\/a>)+?/", $r, $matches);
我希望正則表達式在()
內繼續使用+?
指定匹配+?
在末尾。 但它不會這樣做。 ::嘆::
有任何想法嗎。 我知道必須有一種方法可以在一個正則表達式中執行此操作,而不是將其分解。
只是為了好玩這里的正則表達式將使用單個preg_match_all
:
'%(?:Filed under:\s*+|\G</a>)[^<>]*+<a[^<>]*+>\K[^<>]*%`
或者,以更易讀的格式:
'%(?:
Filed under: # your sentinel string
|
\G # NEXT MATCH POSITION
</a> # an end tag
)
[^<>]*+ # some non-tag stuff
<a[^<>]*+> # an opening tag
\K # RESET MATCH START
[^<>]+ # the tag's contents
%x'
\\G
匹配下一次匹配嘗試開始的位置,這通常是前一次成功匹配結束的位置(但如果前一次匹配為零長度,則會再向前碰撞一次)。 這意味着正則表達式不會匹配的子串開始</a>
直到它匹配一個開始, 之后 Filed under:
在至少一次。
在匹配了標記字符串或結束標記之后, [^<>]*+<a[^<>]*+>
[^ <> [^<>]*+<a[^<>]*+>
會消耗所有內容,包括下一個開始標記。 然后\\K
欺騙起始位置,因此匹配(如果有的話)似乎在<a>
標簽之后開始(它就像一個積極的外觀,但更靈活)。 最后, [^<>]+
匹配標簽的內容,並將匹配位置提升到結束標記,以便\\G
可以匹配。
但是,正如我所說,這只是為了好玩。 如果你沒有做的工作在一個正則表達式,你就要去與像使用一個@codaddict一個多步驟方法更好; 它更具可讀性,更靈活,更易於維護。
編輯:雖然我給出的引用是針對Perl文檔的,但PHP 也支持這些功能 - 或者更准確地說,PCRE lib。 我認為Perl文檔好一點,但您也可以在PCRE手冊中閱讀這些內容。
嘗試:
<?php
$r = 'Filed under: <a>Group1</a>, <a>Group2</a>, <a>Group3</a>, <a>Group4</a>';
if(preg_match_all("/<a.*?>([^<]*?)<\/a>/", $r, $matches)) {
var_dump($matches[1]);
}
?>
輸出:
array(4) {
[0]=>
string(6) "Group1"
[1]=>
string(6) "Group2"
[2]=>
string(6) "Group3"
[3]=>
string(6) "Group4"
}
編輯:
由於您希望在搜索中包含字符串'Filed under'以唯一標識匹配,您可以嘗試這一點,我不確定是否可以使用preg_match的單個調用來完成
// Since you want to match everything after 'Filed under'
if(preg_match("/Filed under:(.*)$/", $r, $matches)) {
if(preg_match_all("/<a.*?>([^<]*?)<\/a>/", $matches[1], $matches)) {
var_dump($matches[1]);
}
}
$r = 'Filed under: <a>Group1</a>, <a>Group2</a>'
$s = explode("</a>",$r);
foreach ($s as $k){
if ($k){
$k=explode("<a>",$k);
print "$k[1]\n";
}
}
產量
$ php test.php
Group1
Group2
我希望正則表達式在()內繼續使用+指定匹配? 在末尾。
+?
是一個懶惰的量詞 - 它將盡可能少地匹配。 換句話說,只有一次。
如果你想多次匹配,你需要一個貪婪的量詞 - +
。
另請注意,您的正則表達式不能正常工作 - 匹配會在遇到標記之間的逗號后立即失敗,因為您沒有考慮到它。 這可能需要糾正。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.