3

我正在编写一个正则表达式,它应该执行以下操作:


如果匹配的段以 开头,则匹配不是 / 不匹配的所有内容:

例子:

asdjhas /* fdjkl */ sdfds:dsfsdf /:sdff/ sdffff

粗体部分应与正则表达式匹配。正如你所看到的,所有的正斜杠都不匹配,只有以 : 开头的部分不匹配。

我想出了这个: ([^/]+) 可以按预期工作,但它也会匹配以 : 开头的部分。我尝试使用否定的前瞻性断言,但老实说,我真的不理解它们。

我也在使用 PHPs preg 库为我做匹配。

谢谢

4

3 回答 3

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(?<=而不是(?:似乎也可以正常工作。

于 2013-04-01T22:35:38.507 回答
1

你可以拆分字符串

/(?::[^/]+/*)?

IE

$string = 'asdjhas/*fdjkl*/sdfds:dsfsdf/:sdff/sdffff';

$parts = preg_split('#/(?::[^/]+/*)?#', $string);

/*
Array
(
    [0] => asdjhas
    [1] => *fdjkl*
    [2] => sdfds:dsfsdf
    [3] => sdffff
)
*/
于 2013-04-01T22:51:28.697 回答
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
)
于 2013-04-01T22:46:54.780 回答