使用preg_match检查字符串是否仅包含A-Z,a-z和 - (破折号)字符

时间:2013-05-25 18:46:15

标签: php regex

我试过了:

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

我变得虚假。我不是很擅长正则表达式,但它似乎适用于http://regexpal.com/

我在这里错过了什么吗?

编辑: 例如$str = zREBsZtyvw

5 个答案:

答案 0 :(得分:6)

描述

此表达式将确保在没有空格的字符串中有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
        )

)

答案 1 :(得分:3)

Jerry和Yomy各自确定了问题的一半。这是整个解决方案:

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

preg_match要求您在regexp的开头和结尾都有匹配的分隔符。你需要锚定正则表达式,以便检查整个字符串,而不只是在强大的任何地方寻找匹配。并且您需要使用*通配符来匹配任意数量的字符。

答案 2 :(得分:2)

是的,使用锚点(^$)指定您只使用这些字符将开始结束字符串:

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

答案 3 :(得分:1)

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

最好的模式是使用重复和开始/结束锚点

“/ ^ [A-ZA-Z - ] * $ /”

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

答案 4 :(得分:0)

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

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

我已经使用了+代替*,因为你想要匹配1个或更多。使用*,空字符串将匹配。