2012-08-15 80 views
3

我知道這個問題已經被問了十幾次,但是這一次從技術上來說不是欺騙(檢查別人,如果你喜歡);)轉換的Javascript正則表達式PHP

基本上,我有一個JavaScript正則表達式是檢查用於前端驗證的電子郵件地址,如果前端驗證無法正常運行(例如,瀏覽器問題),則使用CodeIgniter對後端進行雙重檢查。這是一個很長的正則表達式,我不知道從哪裏開始手動轉換它。

我幾乎找那個JS正則表達式轉換爲PHP的工具正則表達式 - 我還沒有發現一個在任何回答類似的問題(當然,這可能是這樣的工具沒有的)好吧,我騙了 - one of them建議一個花費39.95美元的工具,但我真的不想花那麼多錢來轉換單個表達式(並且不,沒有免費的試用版, 。上述問題)

這裏的JavaScript表達式graciously provided by aSeptik

/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i 

而且通過笨,我不希望使用,因爲它不遵循相同的規則(禁止一些有效地址)所使用的一個:

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

我想用設置相同的規則由PHP中的Javascript正則表達式。

有這種不一致的地方,我的前端代碼說電子郵件地址是好的,然後Codeigniter說它不是,當然是我試圖修復我的應用程序中的行爲。

感謝您的任何和所有提示! :D

+0

是不是Perl的'x'標誌? – 2012-08-15 17:59:37

+0

@LarryBattle它可能是,但使用它的CodeIgniter文件是'.php'文件,完整的行是這樣的:'return(!preg_match(「/ ^([a-z0-9 \ + _ \ - ]] +)(\。[a-z0-9 \ + _ \ - ] +)* @([a-z0-9 \ - ] + \。)+ [az] {2,6} $/ix「,$地址)) ? FALSE:TRUE;' – 2012-08-15 18:01:05

+0

試試這個解決方案。 http://stackoverflow.com/questions/2514810/php-email-validation-question – 2012-08-15 18:04:21

回答

1

我能夠以超乎預期的方式解決這個問題。我無法轉換我想使用的Javascript正則表達式(即使購買了RegexBuddy - 它會派上用場,但它無法產生正確的轉換),所以我決定去看看Regex Validate Email Address網站看看如果他們有任何推薦的正則表達式的建議。這時候,我發現這一點:

「用最好的成績表達是目前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

你是什麼意思,「它不能夠產生一個適當的轉換?」您是否使用命令「從JavaScript //運算符粘貼」並使用If/else分支在Use選項卡上選擇「PHP(preg)」,以查看正則表達式是否與字符串選項匹配(部分)? – 2012-08-16 06:59:16

+0

@TimPietzcker也許我做得不對 - 我把它粘貼在頂部,並使用下拉菜單'JavaScript',然後在底部選擇'使用'選項卡,最後使用'PHP(preg)如果/ else分支正則表達式匹配(字符串的一部分)。也許我應該使用'Paste from JavaScript // Operator'。結果,當我把它放在PHP中時,沒有發現任何錯誤,但沒有任何匹配;一切都恢復爲假。 – 2012-08-16 19:18:22

3

我想你也可以在php中使用javascript正則表達式模式。沒有必要修改正則表達式模式(可能)。只要是有區別的,我知道,PHP的正則表達式被定義爲一個字符串(或字符串)是這樣的:

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

JavaScript的正則表達式不這樣做,以自己的方式做:

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

所以只需更換正則表達式,然後嘗試。作爲推薦,不要在代碼文件中替換它,您可以簡單地擴展或替換原生庫。你可以看看這個:http://codeigniter.com/user_guide/general/creating_libraries.html

+0

謝謝,但是當把JS正則表達式放到'preg_match'中時出現這個錯誤:'Message :preg_match()[function.preg-match]:編譯失敗:PCRE不支持\ L,\ l,\ N {name},\ U或\ u在偏移量44' – 2012-08-15 19:13:39

+0

,所以修改可能有時需要:)看這個主題http://stackoverflow.com/questions/3538293/php-regular-expression-pcre-does-not-support-llnp – Bilal 2012-08-15 19:21:31

相關問題