簡體   English   中英

PHP pcre正則表達式中的命名組

[英]named groups in PHP pcre regex

嘗試匹配這樣的字符串:

/2011/10/Lorem-ipsum-dolor-it-amet-consectetur-adipisicing
/2011/10/Lorem-ipsum-dolor-it-amet-consectetur-adipisicing/

/2011/10/4545
/2011/10/4545/

並獲得年,月和第三部分。 這是我得到的正則表達式:

%/(?P<year>\d{4})/(?P<month>\d{2})/((?P<id>\d{1,})|(?P<permalink>.{1,}))[/]{0,1}$%

盡管生成的matchs數組將始終包含3個變量:year,month和id或永久鏈接。 但是會發生什么—如果永久鏈接匹配—無論如何,我仍然仍然在結果數組中獲得空的id變量。 有沒有辦法重寫一個正則表達式,使結果數組僅包含年,月,id或永久鏈接?

我相信在使用|時,命名組不會被“忽略” | 語法,因為無法知道是否要保留兩個結果。 換句話說, |兩邊 即使條件匹配or大多數編程語言都不匹配,也會對它們進行評估。

例如,如果您有一個正則表達式

/(?P<foo>abc)|(?P<bar>def)/

並且要比較的字符串是abcdef ,在某些情況下,您想知道兩個子表達式都匹配,因此應該設置兩個變量。 而且,如果在某些情況下同時設置了兩個變量,則最好在所有情況下對其進行設置,這樣程序員就不必在處理它們之前首先檢查是否已設置它們。

作為對“是否有辦法重寫正則表達式,使結果數組僅包含年,月,id或永久鏈接”問題的評論,您為什么要這么做? 只需檢查變量是否為空。 如果正則表達式將其中任何一個排除在外,您仍然需要檢查設置了哪個。 可以使用完全相同的邏輯來檢查其中哪個為空。

您不一定需要正則表達式。

        $x = "/2011/10/4545";
        $v = explode("/", $x);
        $r = array_shift($v);
        if(count($v) == 4){
             array_pop($v);
             print_r($v);    }

輸出

Array
(
    [0] => 2011
    [1] => 10
    [2] => 4545

$url = "/2011/10/Lorem-ipsum-dolor-it-amet-consectetur-adipisicing";
    $v = explode("/", $url);
    array_shift($v);
    array_pop($v);
    if(count($v) == 3){
      array_pop($v);
    print_r($v);
} else {

print_r($v); }

輸出

Array
(
    [0] => 2011
    [1] => 10
)

由於它們存在於正則表達式中,因此即使由於|導致它們不匹配任何內容,命名組也將始終包含在匹配組中|

您可能還需要對regex進行一些改進,以代替. <permalink>中用[^/]因為您不希望將斜杠(如果存在)作為永久鏈接的一部分。

但是,正如Mob所指出的那樣,有一種更容易的方法來解析這種簡單的目標:

list($year, $target, $link) = array_slice(explode('/', $url), 1);
if (is_numeric($link)) {
    // $link == id
}
else {
    // $link == permalink
}

暫無
暫無

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

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