PHP中的短代码的正则表达式模式

Luc*_*uca 3 php regex shortcode

我有一个正则表达式的问题,我写的匹配PHP中的短代码.

这是模式,其中$shortcode是短代码的名称:

\[$shortcode(.+?)?\](?:(.+?)?\[\/$shortcode\])?
Run Code Online (Sandbox Code Playgroud)

现在,这个正则表达式对这些格式表现得非常好:

  • [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
)
Run Code Online (Sandbox Code Playgroud)

如您所见,第二个匹配(应该是文本,因为第一个是可选的)包括开始标记的结尾和所有结束标记但最后一个括号.

编辑:发现返回的匹配是第一次捕获,而不是第二次捕获.请参阅Regexr中的正则表达式.

你能帮忙吗?我真的很沮丧.

Arn*_*anc 8

在你的正则表达式:

\[$shortcode(.+?)?\](?:(.+?)?\[\/$shortcode\])?
Run Code Online (Sandbox Code Playgroud)

第一个捕获组(.+?)至少匹配1个字符.

整个组是可选的,但在这种情况下,它碰巧匹配到最后的每一件事].

以下正则表达式有效:

\[$shortcode(.*?)?\](?:(.+?)?\[\/$shortcode\])?
Run Code Online (Sandbox Code Playgroud)

*量词指0或更多,而+表示一个或多个.

  • 有没有人告诉过你你是个天才?:) (3认同)

drz*_*aus 5

当然这是来自 C#,但是

@"\[([\w-_]+)([^\]]*)?\](?:(.+?)?\[\/\1\])?"
Run Code Online (Sandbox Code Playgroud)

应该匹配任何(?)可能的自关闭短代码。

或者你可以从 wordpress 窃取:https : //core.trac.wordpress.org/browser/tags/4.0/src/wp-includes/shortcodes.php#L309

$pattern = '/(\w+)\s*=\s*"([^"]*)"(?:\s|$)|(\w+)\s*=\s*\'([^\']*)\'(?:\s|$)|(\w+)\s*=\s*([^\s\'"]+)(?:\s|$)|"([^"]*)"(?:\s|$)|(\S+)(?:\s|$)/';
$text = preg_replace("/[\x{00a0}\x{200b}]+/u", " ", $text);
if ( preg_match_all($pattern, $text, $match, PREG_SET_ORDER) )...
Run Code Online (Sandbox Code Playgroud)