簡體   English   中英

PHP正則表達式 - 重復匹配組

[英]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一個多步驟方法更好; 它更具可讀性,更靈活,更易於維護。

\\K參考
\\G參考

編輯:雖然我給出的引用是針對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.

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