Я извлек следующий код из плагина jquery.validate, это действительно довольно сложно понять.Я хочу преобразовать их в PHP, и лучше, если вы поможете мне понять каждую часть следующих кодов регулярных выражений.
Подтвердите адрес электронной почты:
/ ^ ((([AZ] | \ 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))) @ ((([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]) | (([AZ] | [\ u00A0- \ uD7FF \ uF900- \ uFDCF\ uFDF0- \ uFFEF]) ([AZ] | \ d | -. | | _ | ~ | [\ u00A0- \ uD7FF \ uF900- \ uFDCF \ uFDF0- \ uFFEF]) * ([AZ] | [\ u00A0- \ uD7FF \ uF900- \ uFDCF \ УФОF0- \ uFFEF]))).? $ / I
Проверить адрес URL:
/ ^ (https? | Ftp): // ((((([AZ] | \ d | -.! | | _ | ~ | [\ u00A0- \ uD7FF \ uF900- \ uFDCF \ uFDF0- \ uFFEF]) | (% [\ да-е] {2}) | [\$ & '() * +, =] |:) * @) (((\ d | [1-9] \ d | 1 \ d \ d | 2 [0-4] \ d | 25 [0?-5]) (\ д |. [1-9] \ д | 1 \ д \ д | 2 [0-4] \ д | 25 [0-5]) (\ д |. [1-9] \д | 1 \ д \ д | 2 [0-4] \ д | 25 [0-5]) (\ д |. [1-9] \ д | 1 \ д \ д | 2 [0-4] \д | 25 [0-5])) | ((([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])))) + (([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])))) (:.? \d )) (/ ((([AZ] | \ d | -. | | | ~ | [\ u00A0- \ uD7FF \ uF900- \ uFDCF \ uFDF0- \ uFFEF]) | (%[\ да-е] {2}) | [\ $ & '() * +, =] |:. | @) + (/ (([AZ] | \ d | - | | |~ | [\ u00A0- \ uD7FF \ uF900- \ uFDCF \ uFDF0- \ uFFEF]) | (% [\ да-е] {2}) | [\ $ & '() * +, =] |:| @) ) )) (\ ((([AZ] | \ d | -. | | _ | ~ | [\ U00A0- \ uD7FF \ uF900- \ uFDCF \ uFDF0- \ uFFEF])? |(% [\ да-е] {2}) | [\ $ & '() * +, =] |:? | @) | [\ uE000- \ uF8FF] | / | \) *) (# ((([AZ] | \ д | -. | | _ | ~ | [\ u00A0- \ uD7FF \ uF900- \ uFDCF \ uFDF0- \ uFFEF]) | (% [\ да-е] {2})| [! \ $ & '() * +,; =] |: | @) | / | \?) *)? $ / i
Одно место особенно смущает меня.Разве (\ x22) не символ B?Почему это просто не говорит B?Почему 0x22 в любом случае полезен для проверки адреса электронной почты?
Спасибо.
Обновление: я изменил его в код PHP,
$ pattern = "/ ^ ((([AZ] | \ d | [# \ $% & '* + - / = \ \ ^ _ {\|}~]|[\x{00A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_
! {\ |} ~?] | [\ х {00A0} - \ х {D7FF} \ х{F900} - \ х {FDCF} \ х {FDF0} - \ х {FFEF}]) +) ) | ((\ x22) ((((\ x20 | \ x09) (\ x0D\ x0a)) (\ x20 |? \ x09) +) (([\ x01- \ x08 \ x0b \ x0c \ x0e- \ x1f \ x7f] |? \ x21 | [\ x23- \ X5b] | [\ X5D- \ x7E] | [\ х {00A0} - \ х {D7FF} \ х {F900} - \ х {FDCF} \ х {FDF0} - \ х {FFEF}]) | (\ ([\ x01- \x09 \ x0b \ x0c \ x0d- \ x7f] | [\ х {00A0} - \ х {D7FF} \ х {F900} - \ х {FDCF} \ х {FDF0} - \ х {FFEF}])))) (((\ x20 | \ x09) (\ x0D \ x0a)) (\ x20 | \ x09)? +) (\ x22))) @ ((([AZ] |? \ d| [\ х {00A0} - \ х {D7FF} \ х {F900} - \ х {FDCF} \ х {FDF0} - \ х {FFEF}]) | (([AZ] | \ д | [\ х{00A0} - \ х {D7FF} \ х {F900} - \ х {FDCF} \ х {FDF0} - \ х {FFEF}]) ([AZ] | \ д | -. | | _ | ~ | [\ х {00A0} - \ х {D7FF} \ х {F900} - \ х {FDCF} \ х {FDF0} - \ х {FFEF}]) * ([AZ] | \ D | [\ х {00A0}- \ х {D7FF} \ х {F900} - \ х {FDCF} \ х {FDF0} - \ х {FFEF}])))) + (([AZ] |. [\ х {00A0} - \ х{D7FF} \ х {F900} - \ х {FDCF} \ х {FDF0} - \ х {FFEF}]) | (([AZ] | [\ х {00A0} - \ х {D7FF} \ х {F900} - \ {х} FDCF \ {х} FDF0 - \ {х} FFEF]) ([AZ] | \ D | - |. | _ | ~ | [\ х {00A0} - \ х {D7FF} \ х {F900} - \ х {FDCF} \ х {FDF0} - \ х {FFEF}]) * ([AZ] | [\ х {00A0} - \ х {D7FF} \х {F900} - \ х {FDCF} \ х {FDF0} - \ х {FFEF}]))) \ $ / у ".?;preg_match ($ pattern, "abc@def.com");
Это говорит,
Предупреждение: preg_match (): Сбой компиляции: несоответствующие скобки по смещению 406 в xxx в строке7.
Я не мог определить, где совпадение скобок.Я попытался сосчитать все скобки, и они выглядят хорошо.И смещение 406 не содержит скобок.