我为匹配 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
)
如您所见,第二个匹配项(应该是文本,因为第一个是可选的)包括开始标记的结尾和除最后一个括号之外的所有结束标记。
编辑:发现返回的匹配是第一次捕获,而不是第二次捕获。请参阅正则表达式中的正则表达式。
你能帮忙吗?我真的把我的头压在了这个上面。
在你的正则表达式中:
'[$shortcode(.+?)?'](?:(.+?)?'['/$shortcode'])?
第一个捕获组(.+?)
至少匹配 1 个字符。
整个组是可选的,但在这种情况下,它恰好将每件事都匹配到最后一个]
。
以下正则表达式有效:
'[$shortcode(.*?)?'](?:(.+?)?'['/$shortcode'])?
*
量词表示 0 或更多,而 +
表示一个或多个。
当然,这是来自 C#,但是
@"'[(['w-_]+)([^']]*)?'](?:(.+?)?'['/'1'])?"
应匹配任何 (?) 可能的自关闭短代码。
或者你可以从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) )...