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);

編集:(?<=代わりに後読みを使用して(?:もうまくいくようです。

于 2013-04-01T22:35:38.507 に答える
1

文字列を分割できます

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

すなわち

$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

もう 1 つの簡単な方法は、代わりに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 に答える