![](/img/trans.png)
[英]SKIP-FAIL regex with multiple patterns to ignore in one PCRE regex
[英]PHP PCRE regex with multiple SKIP FAIL in a pattern
我有一個簡單的字符串:
$string = '--#--%--%2B--';
我想對所有字符(包括“孤獨” %
)進行百分比編碼,但-
字符和%xy
形式的三聯體除外。 所以我寫了以下模式選擇:
$pattern1 = '/(?:[\-]+|%[A-Fa-f0-9]{2})(*SKIP)(*FAIL)|./us';
$pattern2 = '/(?:[\-]+)(*SKIP)(*FAIL)|(?:%[A-Fa-f0-9]{2})(*SKIP)(*FAIL)|./us';
請注意() (*SKIP)(*FAIL)
和(?:)
。
匹配和替換的結果是相同的-也是正確的:
--%23--%25--%2B--
我想問一下:
(*SKIP)(*FAIL)
會出現在整個(選擇的)模式中,我是否也只能應用一個(?:)
? 我知道我要立即提出更多問題,向您要求太多。 請接受我的道歉! 非常感謝你。
PS:我已經使用以下PHP代碼進行了測試:
$result = preg_replace_callback($patternX, function($matches) {
return rawurlencode($matches[0]);
}, $string);
echo $result;
首先,兩種模式都利用了SKIP-FAIL PCRE動詞序列,這是一個眾所周知的“技巧”,可以匹配某些文本並跳過它。 請參閱(* SKIP)或(* F)在正則表達式上如何工作? 有關更多詳細信息。
這兩種模式產生相同的結果, (?:[\\-]+|%[A-Fa-f0-9]{2})(*SKIP)(*FAIL)
匹配[\\-]+
或%[A-Fa-f0-9]{2}
,然后跳過匹配,並且(?:[\\-]+)(*SKIP)(*FAIL)|(?:%[A-Fa-f0-9]{2})(*SKIP)(*FAIL)
首先嘗試匹配[\\-]+
並跳過(如果找到),然后嘗試匹配%[A-Fa-f0-9]{2}
並跳過匹配(如果找到)找到。 第二種模式中的(?:...)
非捕獲組是多余的,因為內部沒有交替,並且這些組也沒有量化。 您可以在模式中使用任意數量的(*SKIP)(*FAIL)
,只需確保在|
之前使用它們即可|
跳過相關比賽。
SKIP-FAIL技術時要匹配在特定的背景下一些文字時,當一個字符應跳過/“回避”如果是之前和之后的一些字符,或者當你需要“避免”匹配的整個序列字符,就像在這種情況下一樣,因此,SKIP-FAIL很好用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.