我希望能够搜索之前由strtoupper()大写的特定代码(最多三个字母)以确保正确性。我希望搜索能够找到第一个角色成为" C"然后最后一个字符是以下之一:L,M,P,C,BC或RC。因此,我实际上希望搜索CL,CM,CP,CC,CBC或CRC。
我有以下内容:
// Make sure designation code is entered
if (empty($designation)) {
echo "<p class='error'>ERROR: Designation code is required</p>";
$valid = false; }
// Make sure designation code is not too long (3 characters)
if (strlen($designation)>3) {
echo "<p class='error'>ERROR: Designation code cannot be more than 3 characters</p>";
$valid = false; }
// Convert designation code to all uppercase
$designation = strtoupper($designation);
// Make sure designation code is valid
if (preg_match("/(CL|CM|CP|CC|CBC|CRC)/",$designation)) {
echo "<p class='error'>ERROR: Designation code not correct</p>";
$valid = false; }
一切都可以达到preg_match()
;没有任何反应的地方。我可以输入任何字母,它会接受它为有效。
我也尝试了以下内容,但我认为这不正确:
if (preg_match("/^C[L|M|P|C|BC|CR]/",$designation)){
echo "<p class='error'>ERROR: Designation code not correct</p>";
$valid = false; }
答案 0 :(得分:0)
你可以尝试
if (preg_match("/(C(L|M|P|C|BC|RC))/i",$designation)) {
echo "<p class='error'>ERROR: Designation code not correct</p>";
$valid = false;
}
事实是,如果你正在寻找整个文本,你将需要preg_match_all,因为php不支持/ g修饰符
答案 1 :(得分:0)
两件重要的事情。
正则表达式部分:
/^C(L|M|P)/i
表示匹配以C开头,后跟L或M或P的任何内容,与案例&#39;匹配,[]表示范围,而不是一组备选方案
php部分:
preg_match在匹配时返回1。非匹配时为0,错误时为false。如果你想明确无误,你的测试应该是这样的
if(preg_match($pattern,$subject) === 1)
{
}
在您的代码示例中,以下内容应该可以正常工作
if (preg_match('/^C(L|M|P|C|BC|RC)/i',$designation) === 1)
{
echo "<p class='error'>ERROR: Designation code not correct</p>";
$valid = false;
}
答案 2 :(得分:0)
据我了解你的问题,你的逻辑是倒退的。如果代码为CL
等,您希望接受它,而不是拒绝它。换句话说,只有preg_match()
返回false时才应拒绝它。只需在致电!
之前添加preg_match()
即可撤销if
条件,如下所示:
// Make sure designation code is valid
if (!preg_match("/(CL|CM|CP|CC|CBC|CRC)/",$designation)) { //notice the ! inside the parentheses
echo "<p class='error'>ERROR: Designation code not correct</p>";
$valid = false;
}
如果我误解了您的要求,请告诉我。
此外,正如其他人所指出的,您可以使用i
标记来避免调用strtoupper()
。如果您只想接受上面列出的代码而不是FCL
,请分别在正则表达式正文之前和之后添加^
和$
。除非您只是想显示有关代码长度的错误,否则这也会使您的strlen检查变得不必要。这将使您的整个代码看起来像这样:
// Make sure designation code is entered
if (empty($designation)) {
echo "<p class='error'>ERROR: Designation code is required</p>";
$valid = false;
}
// Make sure designation code is not too long (3 characters)
// NOTE: This block is now optional
if (strlen($designation)>3) {
echo "<p class='error'>ERROR: Designation code cannot be more than 3 characters</p>";
$valid = false;
}
// Make sure designation code is valid
if (!preg_match("/^(CL|CM|CP|CC|CBC|CRC)$/i",$designation)) { //notice the ! inside the parentheses
echo "<p class='error'>ERROR: Designation code not correct</p>";
$valid = false;
}
答案 3 :(得分:0)
谢谢大家的帮助。通过所有输入,我能够理解发生了什么。至于我的代码,以下工作完美:
if (!preg_match('/C(L|M|P|C|BC|RC)/',$designation)) {
echo "<p class='error'>ERROR: Designation code not correct;
$valid = false;
让preg_match()寻找除列表中的内容以外的东西是我所缺少的。这将查找代码的第一个字母为&#34; C&#34;其余的是列表中的一个选择。另外,我没有要求i
忽略大小写,因为我已经使用strtoupper()
来大写此字段的任何输入。现在,如果输入的内容不在列表中,则会显示错误消息。
答案 4 :(得分:-1)
/^((CL)|(CM)|(CP)|(CC)|(CBC)|(CRC))/i
尝试使用http://www.regexr.com/来使用RegExps。 选项«i»表示忽略大小写。不需要strtoupper。