我试图让这个正则表达式工作以验证名称字段只允许A-Z,'和 - 。
到目前为止,我正在使用它,除了它不会允许撇号工作正常。
if (preg_match("/[^a-zA-Z'-]+/",$firstname)) {
// do something
}
我希望它只允许A-Z, - (破折号)和'(撇号)。它适用于A-Z和 - 但仍然不适用于'
有人可以提供一个例子吗?
谢谢
if (preg_match("/^[A-Z'-]+$/",$firstname)) {
// do something
}
角色类^
中的插入符号[]
将否定该匹配。你拥有它的方式,这意味着如果$firstname
包含a-z
,A-Z
,'
和-
以外的字符。
您的代码已经按照您的要求执行:
<?php
$data = array(
// Valid
'Jim',
'John',
"O'Toole",
'one-two',
"Daniel'Blackmore",
// Invalid
' Jim',
'abc123',
'$@#$%@#$%&*(*&){}//;;',
);
foreach($data as $firstname){
if( preg_match("/[^a-zA-Z'-]+/",$firstname) ){
echo 'Invalid: ' . $firstname . PHP_EOL;
}else{
echo 'Valid: ' . $firstname . PHP_EOL;
}
}
...打印:
Valid: Jim
Valid: John
Valid: O'Toole
Valid: one-two
Valid: Daniel'Blackmore
Invalid: Jim
Invalid: abc123
Invalid: $@#$%@#$%&*(*&){}//;;
单引号在正则表达式中没有任何特殊含义,因此不需要特殊处理。减号(-
),当在[]
内时,意味着范围;如果您需要文字-
,它必须是第一个或最后一个字符,如在您的代码中。
说,错误(如果有的话)是其他地方。
"/[^a-zA-Z'-]+/"
实际上匹配除了a-zA-z'-
之外的所有东西,如果你把^放在表示字符串的开头,你应该把它放在括号之外。此外,你的表达的'-
部分可能被解释为一个范围,所以你应该逃脱-
@Tom回答或逃脱,
,因为其他人回答
从我所看到的。以下正则表达式应该正常工作:
if (preg_match("/^[A-Z\'\-]+$/",$firstname)) {
// do something
}
在这里,我已经逃脱了撇号和破折号。我已经在在线Regex测试仪上对此进行了测试,效果很好。
试试看
你的正则表达式应如下所示:
preg_match("/^[A-Z\'-]+$/",$firstname);
maches:AB
A-B
AB-'
不匹配:Ab
a-B
AB#
<empty string>
if (preg_match("/^[a-zA-Z -]*$/", $firstname)) {
// do something here
}
我用过这个,这样可以。用它。