Rumah > Soal Jawab > teks badan
Saya tahu soalan ini telah ditanya lebih kurang berbelas kali, tetapi secara teknikalnya ia bukan penipuan (semak soalan lain jika anda suka) ;)
Pada asasnya, saya mempunyai regex Javascript yang menyemak alamat e-mel untuk pengesahan bahagian hadapan, dan saya menggunakan CodeIgniter untuk menyemak semula bahagian belakang sekiranya pengesahan bahagian hadapan tidak berfungsi dengan betul (isu pelayar) sebagai contoh. ) Ini adalah regex yang agak panjang dan saya tidak tahu di mana hendak mula menukarnya secara manual.
Saya sedang mencari alat untuk menukar regex JS kepada regex PHP - Saya tidak menemuinya dalam mana-mana jawapan kepada soalan yang serupa (sudah tentu, ada kemungkinan alat sedemikian tidak wujud.) Baiklah, Saya Berbohong - salah seorang daripada mereka mencadangkan alat yang berharga $39.95, tetapi saya benar-benar tidak mahu berbelanja sebanyak itu untuk menukar satu ungkapan (tidak, tiada percubaan percuma, seperti yang dicadangkan oleh jawapan kepada soalan di atas.)
Ini adalah ungkapan Javascript, disediakan dengan murah hati oleh 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
Terdapat juga yang digunakan oleh CodeIgniter, yang saya tidak mahu gunakan kerana ia tidak mengikut peraturan yang sama (tidak membenarkan alamat sah tertentu):
/^([a-z0-9+_-]+)(.[a-z0-9+_-]+)*@([a-z0-9-]+.)+[a-z]{2,6}$/ix
Saya mahu menggunakan peraturan yang sama yang ditetapkan oleh ungkapan biasa Javascript dalam PHP.
Saya mempunyai ketidakkonsistenan ini di mana kod bahagian hadapan saya menyatakan alamat e-mel OK dan kemudian Codeigniter berkata tidak, yang sudah tentu merupakan tingkah laku yang saya cuba betulkan dalam apl.
Terima kasih atas semua petua! :D
P粉9669797652023-10-24 17:52:14
Terdapat beberapa perbezaan antara enjin ekspresi biasa dalam Javascript dan PHP. Sila semak perbandingan enjin regex Artikel memberikan pengetahuan teori, Perbezaan antara Ungkapan Biasa PHP dan Ungkapan Biasa JavaScript Jawapan memberikan maklumat praktikal.
Kebanyakan masa, anda boleh menggunakan corak ungkapan biasa Javascript dalam PHP dengan hanya pengubahsuaian kecil. Sebagai perbezaan asas, ungkapan biasa PHP ditakrifkan sebagai rentetan (atau dalam rentetan) seperti ini:
preg_match('/^\(?(\d{3})\)?[- ]?(\d{3})[- ]?(\d{4})$/',$telephone);
Ungkapan biasa JavaScript tidak, ia ditakrifkan dengan cara tersendiri:
var ptr = new RegExp(/^\(?(\d{3})\)?[- ]?(\d{3})[- ]?(\d{4})$/); // or var ptr = /^\(?(\d{3})\)?[- ]?(\d{3})[- ]?(\d{4})$/;
Anda boleh mencubanya dengan menjalankan ungkapan biasa pada PHP. Adalah disyorkan untuk tidak menggantikannya dalam fail Codeigniter, anda boleh melanjutkan atau menggantikan perpustakaan asli. Anda boleh menyemak Buat Perpustakaan untuk maklumat lanjut.
P粉4623289042023-10-24 14:21:23
Saya dapat menyelesaikan masalah ini dengan cara yang lebih baik daripada jangkaan. Saya tidak dapat menukar regex Javascript yang saya mahu gunakan (walaupun selepas membeli RegexBuddy - ia berguna, tetapi ia tidak akan menghasilkan penukaran yang betul), jadi saya memutuskan untuk menyemak tapak web Regex Verify Email Address dan lihat apa yang mereka ada Adakah terdapat sebarang cadangan untuk ungkapan biasa yang baik. Ketika itulah saya menemui ini:
"Ungkapan pemarkahan tertinggi setakat ini ialah yang digunakan oleh 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
Ia hanya sepadan dengan 4/86 ralat, manakala Javascript yang saya gunakan sepadan dengan 8/86 ralat, jadi PHP adalah lebih tepat. Jadi, saya melanjutkan CodeIgniter Form_validation
库,改为使用 return filter_var($str, FILTER_VALIDATE_EMAIL);
.
...tetapi adakah ia berfungsi dalam 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! Berfungsi secara ajaib! Saya bukan sahaja mendapat ketekalan yang saya cari antara pengesahan bahagian hadapan dan bahagian belakang, tetapi saya juga mendapat ungkapan biasa yang lebih tepat dalam proses itu. Menang-menang!
Terima kasih kepada semua yang memberikan cadangan!