1

使用しているときに、正規表現で複数の行を選択する方法がわかりません

[b]Test[/b]

私のBBコードは正常に動作しますが、試してみると

[b]
Test
[/b]

正規表現で修飾子を使用する必要があることを読みました/s /mが、方法がわかりません。試してみました: preg_match_all(' \[(' . $tags . ')=?(.*?)\](.+?)\[/\1\]/m/s' しかし、機能しません。

助言がありますか?

作業例:

$tags = 'b|i|size|color|center|quote|url|img';
while (preg_match_all('`\[(' . $tags . ')=?(.*?)\](.+?)\[/\1\]`', $string, $matches))
    foreach ($matches[0] as $key => $match) {
        list($tag, $param, $innertext) = array($matches[1][$key], $matches[2][$key], $matches[3][$key]);
4

1 に答える 1

2

修飾子を追加するための構文が正しくありません。まず、適用するのにスラッシュは必要ありません。それらは区切り文字の後に属します(あなたの場合は/butではありません`)。また、すべての修飾子を再度区切る必要はありません。それらをくっつけるだけです。

'`\[(' . $tags . ')=?(.*?)\](.+?)\[/\1\]`ms'

どの区切り文字を使用しても問題ありません。delimiters に関する PHP ドキュメントを参照してください。使用できます

非英数字、非バックスラッシュ、非空白文字。

区切り文字をエスケープする必要があることに注意してください。`したがって、 と の間に違いはありません/。代わりに使用する場合は、正規表現内で/エスケープする必要があります/(そうしないと、PHP はこれが正規表現の終わりであると想定します)。このような:

'/\[(' . $tags . ')=?(.*?)\](.+?)\[\/\1\]/ms'

したがって、区切り文字の選択は、ほとんどの場合、利便性の問題です。可能であれば、正規表現内で発生しないものを使用してください。エスケープする必要はありません。修飾子を追加するため/の表記法をおそらく見つけたのはそのためです。/mPHP のドキュメントに記載されているように、一般的な選択肢は#and~です (私も!かなり頻繁に見てきました)。

于 2012-10-02T14:50:05.820 に答える