使用PHP RegEx嵌套[]

时间:2011-04-30 22:27:07

标签: php regex

我正在努力确保PHP中的字符串只有字母,连字符或撇号。为了实现这一点,我想使用[]制作一系列有效字符。所以我的想法就是这样做:

[[A-Za-z]-'] // Weird syntax highlighting here

这会有用吗?是否可以像这样嵌套括号?这是为了匹配单个字符,即字母,连字符或撇号。我可能会天真地接近这个问题而且没关系,我只是想知道在这样的括号内放括号是否合法。谢谢!

4 个答案:

答案 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}'ʹ’]⁠ ⁠ 

匹配:

  • 任何信件字符,但是一条链接其他信件字符,但是一条链接标识符。
  • 任何 Dash标点符号字符
  • U + 0027 APOSTROPHE(不是首选形式)
  • U + 02B9 MODIFIER LETTER PRIME
  • U + 2019 RIGHT SINGLE QUALATION MARK

答案 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可能更有效。