我正在尝试匹配所有内容,但是[和]之间的所有内容。
<和> [和]之间的所有内容都是\[.+\]
一切,但[和]之间的所有内容都是
[^(\[.+\])]+
搜索文字是
valid[REGEX_EMAIL|REGEX_PASSWORD|REGEX_TEST]
匹配“valid”和“REGEX_EMAIL | REGEX_PASSWORD | REGEX_TEST”。
应该匹配“有效”,但不能匹配“REGEX_EMAIL | REGEX_PASSWORD | REGEX_TEST”。
如何解决?
我希望我的php验证类与CodeIgniter一样......
答案 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)
如果我理解正确的话,这是三种不同的文字:
鉴于此,每个都有一个正则表达式:
^([^\x5B]*)[
]([^\x5B\x5D]*)[
]([^\x5D]*)$
(x5B和x5D是左右括号的十六进制转义。)请注意,整个表达式的匹配将包括标记边界的括号;子表达式1给出了不包括括号的匹配。
答案 6 :(得分:0)
尝试正向前瞻断言(本身未捕获)
^.*(?=\[.+\])
答案 7 :(得分:0)
当Regex Tester时,您不必是正则表达式的主人。只需键入一些测试数据并使用正则表达式,直到获得所需的结果。还有快速参考可以帮助您在右侧。
好吧,至少我是如何处理它们的。