5

PHP のショートコードに一致するように作成した正規表現に問題があります。

これはパターンで、$shortcodeはショートコードの名前です:

\[$shortcode(.+?)?\](?:(.+?)?\[\/$shortcode\])?

さて、この正規表現は次の形式でほとんど問題なく動作します。

  • [shortcode]
  • [shortcode=value]
  • [shortcode key=value]
  • [shortcode=value]Text[/shortcode]
  • [shortcode key1=value1 key2=value2]Text[shortcode]

しかし、最も一般的な形式に問題があるようで、

  • [shortcode]Text[/shortcode]

これは、以下に一致するものとして返します。

Array
(
    [0] => [shortcode]Text[/shortcode]
    [1] => ]Text[/shortcode
)

ご覧のとおり、2 番目の一致 (最初の一致はオプションであるため、テキストである必要があります) には、開始タグの末尾と、最後のブラケットを除くすべての終了タグが含まれています。

編集:返された一致は、2 番目ではなく最初の captureであることがわかりました。Regexr の正規表現を参照してください。

これを手伝ってもらえますか?私は本当にこれに頭を悩ませています。

4

2 に答える 2

11

あなたの正規表現で:

\[$shortcode(.+?)?\](?:(.+?)?\[\/$shortcode\])?

最初のキャプチャ グループ(.+?)は、少なくとも 1 文字と一致します。

グループ全体はオプションですが、この場合、たまたま最後の までのすべてのものに一致し]ます。

次の正規表現が機能します。

\[$shortcode(.*?)?\](?:(.+?)?\[\/$shortcode\])?

*数量詞は 0 以上を意味し、+は 1 以上を意味します。

于 2012-07-05T14:32:30.730 に答える