2

次のテキストがあるとします。

__This_is__ a __test__

イタリックを表すために2つのアンダースコアを使用します。だから私はイタリック体になることを期待This_isしています。testロジックは、2つの連続する二重アンダースコアの間のテキストは、そこにある可能性のある他の数のアンダースコアを含めて、イタリック体にする必要があることを示しています。私が持っている:

__([^_]+)__

グループ1の「2つの連続したアンダースコアではない」に相当するものは何ですか?ありがとう。

4

2 に答える 2

3

オプションは、2つのアンダースコアを一致させることです。

__

次に、現在の位置の前に2つのアンダースコアがないかどうかを確認するために、否定的な見方をします。

__(?!__)

そうでない場合は、任意の文字に一致します。

__(?!__). 

前の1回以上繰り返します。

__((?!__).)+

最後に、別の2つのアンダースコアを一致させます。

__((?!__).)+__

これが最終的な解決策です。

ちょっとしたデモ:

<?php
$text = '__This_is__ a __test__';
preg_match_all('/__(?:(?!__).)+__/', $text, $matches);
print_r($matches);
?>

生成:

Array
(
    [0] => Array
        (
            [0] => __This_is__
            [1] => __test__
        )

)

イデオネに見られるように。

編集

デモで非キャプチャグループを使用したことに注意してください。そうしないと、出力は次のようになります。

Array
(
    [0] => Array
        (
            [0] => __This_is__
            [1] => __test__
        )

    [1] => Array
        (
            [0] => s
            [1] => t
        )

)

つまり、一致した最後の文字((?!__).)はグループ1でキャプチャされます。

グループの詳細については、http://www.regular-expressions.info/brackets.htmlを参照してください。

于 2011-02-02T13:21:37.737 に答える
1
$text = '__This_is__ a __test__';
preg_match_all('/(__([\w]+)__)/', $text, $matches);
print_r($matches);

http://ideone.com/uHJCC

于 2011-02-02T13:30:19.657 に答える