【发布时间】:2015-12-23 10:01:34
【问题描述】:
编辑:
现在,答案就在这里:https://stackoverflow.com/a/23621738/551357
作为纲要,这是我第一次尝试以编程方式构建正则表达式时使用的一些原始代码的摘录,它有效:
$product_category_slugs_str = 'cat1|cat2|cat3|cat4'; //fake product category names
$product_category_slugs_count = count(explode('|',$product_category_slugs_str));
$rule = "($product_category_slugs_str)";
$current_lookahead = '';
$increment = 2;
for($i=0; $i<$product_category_slugs_count; $i++){
//will produce consecutive negative lookaheads like (?!\1)(?!\3)(?!\5)
$current_lookahead .= '(?!\\' . (1+$i*$increment) . ')';
//zero or one word checked by negative lookahead and preceded by a comma
$rule .= "(,$current_lookahead($product_category_slugs_str))?";
}
$rule .= '\/?$';//since it's for a url, adds an ending slash
我必须匹配一个字符串,该字符串包含从预定义列表中挑选的任意数量的逗号分隔词。所以,如果列表是:
- word1
- word2
- word3
正则表达式应该匹配如下字符串:
- 'word1'
- 'word1,word3'
- 'word3'
- 'word3,word1,word2'
等,但不是 'word3,word1,a_word_not_in_whitelist'
我真的不知道如何.. 顺便说一句,单词的白名单是一个数组,所以如果需要,我最终可以通过编程方式构建正则表达式。
可能是这样的
(word1|word2|word3) 后跟零个或多个“,(word1|word2|word3)”
有什么想法吗?
【问题讨论】:
标签: regex