簡體   English   中英

PHP正則表達式 - 使用元字符作為分隔符

[英]PHP regular expressions - using metacharacters as delimiters

所以我一直在閱讀php(PCRE)正則表達式doco,我注意到有關分隔符的部分( http://php.net/manual/en/regexp.reference.delimiters.php )說:

“分隔符可以是任何非字母數字,非反斜杠,非空白字符。”

它還討論了使用括號作為分隔符:

“將括號樣式分隔符用作模式中的元字符時不需要進行轉義,但與其他分隔符一樣,它們在用作文字字符時必須進行轉義。”

我的問題是,如何使用其他正則表達式元字符作為分隔符,以及將它們用作模式中的元字符?

從測試我已經完成它不可能使用元字符,如'|' 作為模式中的分隔符和元字符。 我想不出有什么理由需要這樣做,但我很好奇“正確”的答案是什么。

顯然,選擇在模式中具有特殊含義的分隔符可能會導致容易避免的麻煩。 當然,不要這樣做。

但為了滿足您的好奇心,您的觀察結果似乎是正確的,如果您將其用作分隔符,則無法保留角色的特殊含義。 讓我們瀏覽一下PCRE函數的相關PHP源代碼,了解原因。 (為簡單起見,這里省略了一些代碼。)

首先,它會跳過遇到的任何前導空格。

while (isspace((int)*(unsigned char *)p)) p++;

之后,選擇delimiter作為字符串中的第一個字符。

delimiter = *p++;

接着,判定是否在end_delimiter將是相同的字符作為start_delimiter或這是否是補充至一個開口括號字符(即, )的補(]互補[等)。 回想一下手冊如何明確指出支架式字符是以這種方式特殊處理的。

start_delimiter = delimiter;
if ((pp = strchr("([{< )]}> )]}>", delimiter)))
    delimiter = pp[5];
end_delimiter = delimiter;

pp = p;

如果分隔符不是互補括號 - 而是兩個字符都相同 - 則結束分隔符被確定為第一個未轉義的匹配字符。

while (*pp != 0) {
    if (*pp == '\\' && pp[1] != 0) pp++;
    else if (*pp == delimiter)
        break;
    pp++;
}

一切都非常簡單,但是一旦找到分隔符,包含的pattern被確定為兩個分隔符之間的逐字符串。

pattern = estrndup(p, pp-p);

因此,您最初在模式中轉義的任何字符仍將作為轉義字符傳輸到基礎PCRE函數中的模式解析器本身。

re = pcre_compile(pattern, ...

此時,無論您選擇哪個分隔符,孤立的模式都是相同的。 實際的正則表達式引擎完全沒有您的選擇。

我希望這就是你所要求的。 :-)

暫無
暫無

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

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