1

私は正規表現を初めて使用し、問題が発生しています。{{#user_data?}}​​と{{/ user_data?}}​​の間のすべてを取得しようとしています

$content = '
{{#user_data?}}
<span class="hello">
Hello, {{username}}!
</span>
{{/user_data?}}';

$key = 'user_data?';
$regex = '/\{\{#'.$key.'\}\}(.*?)\{\{\/'.$key.'\}\}/';
if (preg_match_all($regex, $content, $matches))
{
print_r($matches);
}
else
echo 'no match found';

私は何が間違っているのですか?

4

1 に答える 1

2

コメントの「?記号をエスケープしない」に加えて、適切な修飾子も必要です。

$content = <<<STR
{{#user_data?}}
<span class="hello">
Hello, {{username}}!
</span>
{{/user_data?}}
STR;

$key = 'user_data\?';
$regex = '/\{\{#'.$key.'\}\}(.*?)\{\{\/'.$key.'\}\}/sim';
preg_match_all($regex, $content, $matches,PREG_SET_ORDER);
print_r($matches);

これは出力します:

Array
(
    [0] => Array
        (
            [0] => {{#user_data?}}
<span class="hello">
Hello, {{username}}!
</span>
{{/user_data?}}
            [1] => 
<span class="hello">
Hello, {{username}}!
</span>

        )

)

i必須ではありません。大文字と小文字を区別するテンプレートが必要な場合は削除する必要があります。

mPCRE修飾子に関するPHPドキュメントによると、これも不要な場合があります。

sは必須なので、複数行の文字列をドットと一致させることができます。

于 2012-11-14T03:42:24.450 に答える