質問

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

__This_is__ a __test__

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

__([^_]+)__

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

役に立ちましたか?

解決

オプションは、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__
        )

)

見ることができるように IDEONE.

編集

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

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

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

)

つまり、最後に一致する文字 ((?!__).) グループ1でキャプチャされていたでしょう。

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

他のヒント

$text = '__This_is__ a __test__';
preg_match_all('/(__([\w]+)__)/', $text, $matches);
print_r($matches);

http://ideone.com/uhjcc

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top