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