我正在开展一个项目,我必须验证BECS字符。批量电子结算系统(BECS)仅允许使用以下字符。
BECS字符集
Type Description
Numeric 0 to 9
Alphabetic Uppercase A to Z and Lowercase a to z
+ Plus sign
- Minus sign or hyphen
@ At sign
SP Blank space
$ Dollar sign
! Exclamation mark
% Percentage sign
& Ampersand
( Left Parenthesis
) Right Parenthesis
* Asterik
. Period or decimal point
/ Solidus (slash)
# Number Sign (Pound or Hash)
= Equal Sign
: Colon
; Semicolon
? Question mark
, Comma
’ Apostrophe
[ Left square bracket
] Right square bracket
_ Low line (underscore)
^ Circumflex
我尝试过以下但不能正常工作:
preg_match("/^[A-Za-z0-9^_[]',?;:=#/.*()&%!$ @+-]+$/", $string);
答案 0 :(得分:5)
不要担心手动转义,而是使用preg_quote
然后代码就是
preg_match("/^[A-Za-z0-9".preg_quote("^_[]',?;:=#/.*()&%!$ @+-", "/")."]+$/", $string);
答案 1 :(得分:3)
在character classes内,您无需转义大多数元字符。
/^[A-Za-z0-9^_[\]',?;:=#\/.*()&%!$ @+-]+$/
]
以阻止其关闭字符类/
需要转义,因为我们将其用作正则表达式分隔符-
不需要转义,因为它是班级中的最后一个字符^
不需要转义,因为它不是班级中的第一个角色
或者,如果您想要更短的表达式,以下正则表达式涵盖相同的范围:
/^[ !#-;=?-[\]^_a-z]+$/
答案 2 :(得分:1)
你必须逃避字符串中的大多数字符,因为它们在正则表达式中具有特殊含义
(当然你没有逃过领先的q1
和尾随的^
,因为它们表明行中没有其他字符):
$
对于记录,BECS允许的字符与正则表达式字符列表:
preg_match("/^[A-Za-z0-9\\^_\\[\\]',\\?;:=#/\\.\\*\\(\\)\\&\\%!\\$ @\\+\\-]+$/", $string);