Intereting Posts
Вызов функции-члена на не-объекте – работает localhost, но не в сети Как проверить подпись с phpseclib в сообщении подписи XML? Как исправить предупреждение с даты () в PHP " Как создать sub.domain для пользователя opon зарегистрироваться Laravel Назад на страницу со старым вводом для проверки Вычислить lat / lng углов наложения на землю из kml-файла Измените размеры столбцов mySql для размещения зашифрованных данных – сколько? Регулярное выравнивание или preg_replace пробел, включая вкладки и новые строки msvcr110.dll отсутствует при ошибке компьютера при установке PHP Маршрутизация и переадресация раздела администратора CakePHP WooCommerce: функция, возвращающая все идентификаторы продукта в определенной категории Хеширование PHP Bcrypt Установите cookie, чтобы никогда не истекать Извлечение чисел с плавающей запятой из строки в PHP Получите переменные GET из строки URL

Преобразование Javascript Regex в PHP

Я знаю, что этот вопрос задавали примерно дюжину раз, но это не технически обман (проверьте остальные, если хотите);)

В принципе, у меня есть регулярное выражение Javascript, которое проверяет адреса электронной почты, которые я использую для проверки на лицевой стороне, и я использую CodeIgniter для двойной проверки на задней панели, если проверка на передней панели не работает должным образом (например, проблемы браузера .) Это QUITE длинное регулярное выражение, и я понятия не имею, с чего начать конвертировать его вручную.

Я очень ищу инструмент, который преобразует регулярные выражения JS в регулярные выражения PHP. Я не нашел ни одного из ответов на подобные вопросы (конечно, возможно, что такого инструмента не существует.) Хорошо, я lied – один из них предложил инструмент стоимостью $ 39,95, но я действительно не хочу тратить столько, чтобы преобразовать одно выражение (и нет, нет бесплатной пробной версии, как было предложено ответом на вышеупомянутый вопрос).

Вот выражение Javascript , любезно предоставленное aSeptik :

/^((([az]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([az]|\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)))@((([az]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([az]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([az]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([az]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([az]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([az]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([az]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([az]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i 

И тот, который используется CodeIgniter, который я не хочу использовать, потому что он не соответствует тем же правилам (запрещает некоторые действительные адреса):

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

Я хочу использовать те же правила, что и регулярные выражения Javascript в PHP .

Имея такую ​​несогласованность, когда мой внешний код говорит, что адрес электронной почты в порядке, а затем Codeigniter говорит, что это не так, это, конечно, поведение, которое я пытаюсь исправить в своем приложении.

Спасибо за любые советы! : D

Я думаю, вы можете использовать шаблоны регулярных выражений javascript в php тоже. Нет необходимости изменять шаблон регулярного выражения (возможно). Просто есть разница, которую я знаю, php regex определяется как строка (или строка) следующим образом:

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

javascript regex не делает, делайте по-своему:

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

поэтому просто замените регулярное выражение и попробуйте. В качестве рекомендации не заменяйте его в файлах codeigniter, вы можете просто расширить или заменить собственную библиотеку. Вы можете посмотреть на это: http://codeigniter.com/user_guide/general/creating_libraries.html

Я смог решить это лучше, чем ожидалось. Мне не удалось преобразовать регулярное выражение Javascript, которое я хотел использовать (даже после покупки RegexBuddy – он пригодится, но он не смог произвести надлежащее преобразование), поэтому я решил посмотреть на Regex Validate Email Address чтобы увидеть, есть ли у них какие-либо рекомендации в любом месте для хороших регулярных выражений. Вот когда я нашел это:

«Выражение с лучшим результатом в настоящее время является тем, которое используется filter_var() PHP:

 /^(?!(?:(?:\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,}(?:(?:[az][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,}(?:(?:[az][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! Работает как шарм! Я не только получил согласованность, которую я искал между проверкой переднего и заднего конца, но я также получил более точное регулярное выражение в этом процессе. Двойной выигрыш!

Спасибо всем тем, кто предоставил предложения!