[英]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.