使用preg_match检查一个字符串是否只包含A-Z、a-z和-(破折号)字符。

4

我尝试过:

print_r(preg_match("[A-Za-z\\-]", $str));

我得到了false。我不太擅长正则表达式,但它在http://regexpal.com/上似乎有效。

这里有什么我漏掉的吗?

编辑: 例如:$str = zREBsZtyvw

5个回答

7

描述

此表达式将确保您在字符串中拥有1个或多个大写字母、小写字母或连字符,并且没有空白。

^[A-Za-z\\-]{1,}$

enter image description here

匹配模式说明:

(^[A-Za-z\\-]{1,}$)

匹配如下:

(

^ 字符串的开头

[A-Za-z\\-]{1,} 任何字符:'A' 至 'Z','a' 至 'z','\', '-'(至少1次(匹配最多数量))

$ 可选的 \n 前面,字符串的结尾

) 组的结束

PHP 代码示例:

<?php
$sourcestring="zREBsZtyvw";
preg_match_all('/^[A-Za-z\\-]{1,}$/i',$sourcestring,$matches);
echo "<pre>".print_r($matches,true);
?>

$matches Array:
(
    [0] => Array
        (
            [0] => zREBsZtyvw
        )

)

2
我看了一下你的个人资料。你的正则表达式答案非常详细。感谢你在模式匹配方面几乎涵盖了所有内容,我很感激你的努力。 - meiryo
谢谢你的赞美。我非常喜欢接受这些挑战,并使它们易于理解 :) - Ro Yo Mi
请使用 + 代替 {1,} - Tim Pietzcker
+{1,} 在功能上是相同的,但是如果您稍后决定要匹配至少2个或最多X个内容,则使用{1,}更容易查找和修改。 - Ro Yo Mi
你用什么应用程序生成了这个图表? - Nassim

3
杰瑞和约米各自找到了问题的一半。这是完整的解决方案:
print_r(preg_match("/^[A-Za-z\\-]*$/", $str));

preg_match 要求您在正则表达式的开头和结尾使用匹配的定界符。您还需要锚定正则表达式,以便它将检查整个字符串,而不仅仅是在字符串中查找匹配项。并且您需要使用 * 通配符来匹配任意数量的字符。


2

是的,请使用锚点(^$)来指定您的字符串仅以这些字符开头和结尾:

print_r(preg_match("/^[A-Za-z\\-]$/", $str));
                     ^           ^

我收到了这个警告:警告:preg_match():未找到结束定界符'^' - meiryo
@meiryo 啊,我忘记了 preg_match() 需要在正则表达式前后加上斜杠。我对它不是很熟悉。请查看已编辑的答案。 - Jerry

1

实际上-您的模式开头和结尾缺少转义字符(/),并且您使用了[],它只匹配组中的一个字符

最佳模式应该使用重复和开始/结束锚点

"/ ^ [a-zA-Z-] * $ /"

print_r(preg_match("/ ^ [a-zA-Z-] * $ /", $str));


这个可以工作,但它仍然接受0-9并返回true。 - meiryo
抱歉 - 我的浏览器刚才误导我发送了不完整的内容,所以我进行了编辑... 现在应该可以了。- Barmar 也同时发送了类似的信息。 - YomY

0

不需要双反斜杠..但是你还需要在正则表达式的开头和结尾加上分隔符(/'s)

print_r(preg_match("/^[A-Za-z\-]+$/", $str));

我使用了“+”而不是“*”,因为您想匹配1个或多个。如果使用“*”,则空字符串将匹配。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接