REGEX匹配除/之外的所有内容:

时间:2013-04-01 22:27:10

标签: php regex preg-match

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

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

示例:

asdjhas / * fdjkl * / sdfds:dsfsdf /:SDFF /的 sdffff

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

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

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

由于

3 个答案:

答案 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
)