我正在努力确保PHP中的字符串只有字母,连字符或撇号。为了实现这一点,我想使用[]制作一系列有效字符。所以我的想法就是这样做:
[[A-Za-z]-'] // Weird syntax highlighting here
这会有用吗?是否可以像这样嵌套括号?这是为了匹配单个字符,即字母,连字符或撇号。我可能会天真地接近这个问题而且没关系,我只是想知道在这样的括号内放括号是否合法。谢谢!
答案 0 :(得分:3)
我假设您在其中一个正则表达式匹配函数中使用它(如preg_match("[[A-Za-z]-']*", ...)
,在这种情况下,这不是PHP语法的问题,而是正则表达式语法的问题。答案是不,你不能像这样嵌套括号。如果你想要一个只匹配字母,连字符或撇号的正则表达式,请使用[A-Za-z'-]
。(连字符最后一次,以便正则表达式引擎知道它不代表一系列字符如A-Z
。或者您可以使用反斜杠转义连字符,然后将其放在任何位置:[A-Za-z\-']
。)
答案 1 :(得分:1)
我不明白。
有什么问题
[A-Za-z'-]
答案 2 :(得分:0)
[\pL\p{Pd}'ʹ’]
匹配:
答案 3 :(得分:0)
要确保字符串仅包含所需字符,您可以通过两种方式执行此操作:
这是一个演示两种方法的PHP代码段:
// Method 1: Good if all chars in the string are valid.
$re_all_valid = '/^[A-Za-z\-\']*$/';
if (preg_match($re_all_valid, $text)) {
echo("GOOD: String contains all valid characters.\n");
} else {
echo("BAD: String does NOT contain all valid characters.\n");
}
// Method 2: Bad if any one char in the string is invalid.
$re_one_invalid = '/[^A-Za-z\-\']/';
if (preg_match($re_one_invalid, $text)) {
echo("BAD: String contains one invalid character.\n");
} else {
echo("GOOD: String does NOT contain one invalid character.\n");
}
注意:方法1需要字符串两端的锚点和应用于正字符类的量词。方法2使用否定字符类,只需要匹配字符串中的一个字符。方法2可能更有效。