我正在写一个正则表达式,应该执行以下操作:
匹配不是a /的所有内容 如果匹配的段以以下内容开头,则不匹配:
示例:
asdjhas / * fdjkl * / sdfds:dsfsdf /:SDFF /的 sdffff
粗体部分应与正则表达式匹配。正如您所看到的,所有正斜杠都不匹配以仅以:开头的部分。
我想出了这个:( [^ /] +)按预期工作,但它也会匹配以:开头的部分。我尝试使用否定前瞻断言但说实话,我真的不理解它们。
我也在使用PHPs preg库为我做匹配。
由于
答案 0 :(得分:2)
我认为这就是您所需要的,它确实适用于您的测试字符串:
preg_match_all('@
(?: # start group
^ # start of string
| # OR
/ # slash character
) # end grouping
( # start capture
[^:/] # character class of anything except colon and slash
.*? # anything until...
) # end capture
(?= # start lookahead
/ # literal slash (lookahead is used so it is not consumed
# which allows a slash to be used to start the next group)
| # OR
$ # end of the string
) # end lookahead
@x', $str, $matches);
编辑:使用lookbehind (?<=
代替(?:
似乎也可以正常工作。
答案 1 :(得分:1)
您可以在
上拆分字符串/(?::[^/]+/*)?
即
$string = 'asdjhas/*fdjkl*/sdfds:dsfsdf/:sdff/sdffff';
$parts = preg_split('#/(?::[^/]+/*)?#', $string);
/*
Array
(
[0] => asdjhas
[1] => *fdjkl*
[2] => sdfds:dsfsdf
[3] => sdffff
)
*/
答案 2 :(得分:0)
另一种简单方法就是使用preg_split()代替:
$string = 'asdjhas/fdjkl/sdfds:dsfsdf/:sdff/sdffff';
$m = preg_split('/\/(:[^\/]*\/?)?/', $string);
print_r(array_filter($m));
结果:
Array
(
[0] => asdjhas
[1] => fdjkl
[2] => sdfds:dsfsdf
[3] => sdffff
)