簡體   English   中英

PHP PCRE正則表達式,以多個模式跳過

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

我想問一下:

  • 兩種模式是否等效? 如果不是,那么哪一位適合用於url編碼? 您能用幾句話解釋一下為什么嗎?
  • 您會建議其他替代方法(暗示回溯控制動詞),還是我的模式是一個不錯的選擇?
  • 即使(多個) (*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.

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