搜尋

首頁  >  問答  >  主體

轉換JavaScript正規表示式為PHP

我知道這個問題已經被問了大約十幾次,但從技術上講,這個問題並不是一個騙局(如果您願意,請檢查其他問題);)

基本上,我有一個 Javascript 正規表示式來檢查用於前端驗證的電子郵件地址,並且我使用 CodeIgniter 在後端進行雙重檢查,以防前端驗證無法正常運行(瀏覽器問題)例如。 )這是一個相當長的正則表達式,我不知道從哪裡開始手動轉換它。

我正在尋找將JS 正規表示式轉換為PHP 正規表示式的工具 - 我還沒有在類似問題的任何答案中找到它(當然,有可能這樣一個工具不存在。)好吧,我撒謊了- 其中一個建議了一個花費39.95 美元的工具,但我真的不想花那麼多錢來轉換單個表達式(不,沒有免費試用版,因為由上述問題的答案建議。 )

這是 Javascript 表達式,由 aSeptik 慷慨提供:

/^((([a-z]|d|[!#$%&'*+-/=?^_`{|}~]|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF])+(.([a-z]|d|[!#$%&'*+-/=?^_`{|}~]|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF])+)*)|((x22)((((x20|x09)*(x0dx0a))?(x20|x09)+)?(([x01-x08x0bx0cx0e-x1fx7f]|x21|[x23-x5b]|[x5d-x7e]|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF])|(\([x01-x09x0bx0cx0d-x7f]|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF]))))*(((x20|x09)*(x0dx0a))?(x20|x09)+)?(x22)))@((([a-z]|d|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF])|(([a-z]|d|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF])([a-z]|d|-|.|_|~|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF])*([a-z]|d|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF]))).)+(([a-z]|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF])|(([a-z]|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF])([a-z]|d|-|.|_|~|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF])*([a-z]|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF]))).?$/i

還有 CodeIgniter 使用的那個,我不想使用它,因為它不遵循相同的規則(不允許某些有效地址):

/^([a-z0-9+_-]+)(.[a-z0-9+_-]+)*@([a-z0-9-]+.)+[a-z]{2,6}$/ix

我想使用 PHP 中的 Javascript 正規表示式設定的相同規則

出現這種不一致的情況,我的前端程式碼說電子郵件地址沒問題,然後 Codeigniter 說不行,這當然是我試圖在應用程式中修復的行為。

感謝您提供的所有提示! :D

P粉465675962P粉465675962426 天前905

全部回覆(2)我來回復

  • P粉966979765

    P粉9669797652023-10-24 17:52:14

    Javascript 和 PHP 中的正規表示式引擎之間存在一些差異。請檢查正規表示式引擎的比較 文章提供理論知識,PHP 正規表示式和 JavaScript 正規表示式之間的差異 答案提供實用資訊。

    大多數時候,您可以在 PHP 中使用 Javascript 正規表示式模式,只需進行少量修改。作為一個根本的區別,PHP 正規表示式被定義為一個字串(或在一個字串中),如下所示:

    preg_match('/^\(?(\d{3})\)?[- ]?(\d{3})[- ]?(\d{4})$/',$telephone);

    Javascript 正規表示式不是,它以自己的方式定義:

    var ptr = new RegExp(/^\(?(\d{3})\)?[- ]?(\d{3})[- ]?(\d{4})$/);
    // or
    var ptr = /^\(?(\d{3})\)?[- ]?(\d{3})[- ]?(\d{4})$/;

    您可以透過在 PHP 上執行正規表示式來嘗試。建議不要在 Codeigniter 檔案中替換它,您可以簡單地擴展或替換本機庫。您可以查看建立庫以獲取更多資訊。

    回覆
    0
  • P粉462328904

    P粉4623289042023-10-24 14:21:23

    我能夠以比預期更好的方式解決這個問題。我無法轉換我想要使用的Javascript 正規表示式(即使在購買RegexBuddy 之後- 它會派上用場,但它無法產生正確的轉換),所以我決定去查看Regex 驗證電子郵件地址 網站,看看他們是否有任何建議好的正規表示式。就在那時我發現了這個:

    「目前得分最高的表達式是 PHP 的 filter_var() 所使用的表達式」:

    /^(?!(?:(?:\x22?\x5C[\x00-\x7E]\x22?)|(?:\x22?[^\x5C\x22]\x22?)){255,})(?!(?:(?:\x22?\x5C[\x00-\x7E]\x22?)|(?:\x22?[^\x5C\x22]\x22?)){65,}@)(?:(?:[\x21\x23-\x27\x2A\x2B\x2D\x2F-\x39\x3D\x3F\x5E-\x7E]+)|(?:\x22(?:[\x01-\x08\x0B\x0C\x0E-\x1F\x21\x23-\x5B\x5D-\x7F]|(?:\x5C[\x00-\x7F]))*\x22))(?:\.(?:(?:[\x21\x23-\x27\x2A\x2B\x2D\x2F-\x39\x3D\x3F\x5E-\x7E]+)|(?:\x22(?:[\x01-\x08\x0B\x0C\x0E-\x1F\x21\x23-\x5B\x5D-\x7F]|(?:\x5C[\x00-\x7F]))*\x22)))*@(?:(?:(?!.*[^.]{64,})(?:(?:(?:xn--)?[a-z0-9]+(?:-[a-z0-9]+)*\.){1,126}){1,}(?:(?:[a-z][a-z0-9]*)|(?:(?:xn--)[a-z0-9]+))(?:-[a-z0-9]+)*)|(?:\[(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){7})|(?:(?!(?:.*[a-f0-9][:\]]){7,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?)))|(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){5}:)|(?:(?!(?:.*[a-f0-9]:){5,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3}:)?)))?(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))(?:\.(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))){3}))\]))$/iD

    它只符合了 4/86 錯誤,而我使用的 Javascript 符合了 8/86 錯誤,所以 PHP 的更準確一些。因此,我擴展了 CodeIgniter Form_validation 函式庫,改為使用 return filter_var($str, FILTER_VALIDATE_EMAIL);

    ...但是它在 Javascript 中有效嗎?

    var pattern = new RegExp(/^(?!(?:(?:\x22?\x5C[\x00-\x7E]\x22?)|(?:\x22?[^\x5C\x22]\x22?)){255,})(?!(?:(?:\x22?\x5C[\x00-\x7E]\x22?)|(?:\x22?[^\x5C\x22]\x22?)){65,}@)(?:(?:[\x21\x23-\x27\x2A\x2B\x2D\x2F-\x39\x3D\x3F\x5E-\x7E]+)|(?:\x22(?:[\x01-\x08\x0B\x0C\x0E-\x1F\x21\x23-\x5B\x5D-\x7F]|(?:\x5C[\x00-\x7F]))*\x22))(?:\.(?:(?:[\x21\x23-\x27\x2A\x2B\x2D\x2F-\x39\x3D\x3F\x5E-\x7E]+)|(?:\x22(?:[\x01-\x08\x0B\x0C\x0E-\x1F\x21\x23-\x5B\x5D-\x7F]|(?:\x5C[\x00-\x7F]))*\x22)))*@(?:(?:(?!.*[^.]{64,})(?:(?:(?:xn--)?[a-z0-9]+(?:-[a-z0-9]+)*\.){1,126}){1,}(?:(?:[a-z][a-z0-9]*)|(?:(?:xn--)[a-z0-9]+))(?:-[a-z0-9]+)*)|(?:\[(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){7})|(?:(?!(?:.*[a-f0-9][:\]]){7,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?)))|(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){5}:)|(?:(?!(?:.*[a-f0-9]:){5,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3}:)?)))?(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))(?:\.(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))){3}))\]))$/i);

    Zing!奇蹟般有效!我不僅獲得了前端和後端驗證之間所尋求的一致性,而且在此過程中還獲得了更準確的正規表示式。雙贏!

    感謝所有提供建議的人!

    回覆
    0
  • 取消回覆