一切,但[和]之间的一切

时间:2010-01-06 20:36:28

标签: php regex codeigniter

我正在尝试匹配所有内容,但是[和]之间的所有内容。

<和> [和]之间的所有内容都是

\[.+\]

一切,但[和]之间的所有内容都是

[^(\[.+\])]+

搜索文字是

valid[REGEX_EMAIL|REGEX_PASSWORD|REGEX_TEST]

匹配“valid”和“REGEX_EMAIL | REGEX_PASSWORD | REGEX_TEST”。

应该匹配“有效”,但不能匹配“REGEX_EMAIL | REGEX_PASSWORD | REGEX_TEST”。

如何解决?

我希望我的php验证类与CodeIgniter一样......

8 个答案:

答案 0 :(得分:5)

[^(\[.+\])]+并不代表您认为的含义。

从字面上看,它意味着“匹配任何字符,除了任何其中一个(。[。+]一次或多次。”

[]是一个字符集,与该集合中的一个字符匹配(如果它以^开头,则不匹配)

答案 1 :(得分:2)

我相信你会在所谓的负向前瞻中找到答案。它允许您在搜索中包含模式,而不会在匹配中包含它们。

/^.*(?!\[.+\])$/

(?!...)是负面的先行部分。

答案 2 :(得分:1)

$string = 'valid[REGEX_EMAIL|REGEX_PASSWORD|REGEX_TEST]';

preg_match('#(\S+)\[.+?\]#', $string, $match);

echo $match[1];

答案 3 :(得分:1)

根据您使用的数据'有效[REGEX_EMAIL | REGEX_PASSWORD | REGEX_TEST]'

尝试此操作
^[^[]+   

它将返回“有效”。

根据您使用的语言,您可能需要转义[,所以请按照此^[^\[]+

进行编写

这个正则表达式假设在[REGEX_EMAIL | REGEX_PASSWORD | REGEX_TEST]之前的文本中永远不会有“[”

我使用Eric Gunnerson的RegexWorkbench for .NET

进行了测试

答案 4 :(得分:1)

我现在已经检查了CI's Validation class的源代码。

他们允许将规则设置为

array('field' => "valid|length[5]|foo|callback_bar")

我没有在方括号内看到任何嵌套的方括号或管道。 Docs清楚地说,你可能只有一个参数。该字符串在内部设置为$_rules。验证时,首先将字符串exploded放入数组中,因此上述值将评估为$rules

'field' => array('valid', 'length[5]', 'foo', 'callback_bar')

然后他们遍历数组,检查$rule是否是substr()的回调。然后他们会检查$rule中是否有方括号"/(.*?)\[(.*?)\]/",如果有,请将其从$rule中取出并将括号的内部部分存储为$param 。最后,他们只使用检测到的参数执行$rule作为变量函数,例如$rule(POST[$field], 5);

正如你所看到的,他们并没有一气呵成。这不能回答你的问题,但是对CI的内部逻辑有所了解以使他们的Validator运行可能会帮助你重新思考你的方法。

意见:我想补充一点,他们的做法非常糟糕。验证器链是Command Pattern的主要候选者。当然,通过小而紧凑的字符串来指定验证器是很好的,但是当你真正运行链时,你可以通过很多丑陋的字符串来解决这个问题。看看Zend Framework如何做或看PHPs native filter functions

答案 5 :(得分:0)

如果我理解正确的话,这是三种不同的文字:

  1. 从头到尾[
  2. 在a和[
  3. 之间
  4. 从最后一个到最后
  5. 鉴于此,每个都有一个正则表达式:

    1. ^([^\x5B]*)[
    2. ]([^\x5B\x5D]*)[
    3. ]([^\x5D]*)$
    4. (x5B和x5D是左右括号的十六进制转义。)请注意,整个表达式的匹配将包括标记边界的括号;子表达式1给出了不包括括号的匹配。

答案 6 :(得分:0)

尝试正向前瞻断言(本身未捕获)

^.*(?=\[.+\])

答案 7 :(得分:0)

Regex Tester时,您不必是正则表达式的主人。只需键入一些测试数据并使用正则表达式,直到获得所需的结果。还有快速参考可以帮助您在右侧。

好吧,至少我是如何处理它们的。