イタリックテキストを解析するための正規表現?
質問
次のテキストがあるとします。
__This_is__ a __test__
斜体を示すために2つのアンダースコアを使用します。だから私は期待します This_is
と test
斜体になる。ロジックは、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);
所属していません StackOverflow