Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/235.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 类似于WordPress短代码的正则表达式_Php_Regex_Shortcode - Fatal编程技术网

Php 类似于WordPress短代码的正则表达式

Php 类似于WordPress短代码的正则表达式,php,regex,shortcode,Php,Regex,Shortcode,我读过其他有类似问题的线程。但是没有特定于这种情况-如果我在主短代码中包含了相同类型的短代码怎么办 这是演示的短代码- 输入 测试正则表达式 \[cigar].*?\[\/cigar\] 正确的输出为- [cigar] [cigar] [cigar] ceva [/cigar] [/cigar] [/cigar] 不是 有什么解决方案吗?只需添加一个消极的前瞻性断言,如下所示 \[cigar].*?\[\/cigar\](?!\s*\[\/) (?!\s*\[\/)反向前瞻断言,匹配后会

我读过其他有类似问题的线程。但是没有特定于这种情况-如果我在主短代码中包含了相同类型的短代码怎么办

这是演示的短代码-

输入

测试正则表达式

\[cigar].*?\[\/cigar\]
正确的输出为-

[cigar] [cigar] [cigar] ceva [/cigar] [/cigar] [/cigar]
不是


有什么解决方案吗?

只需添加一个消极的前瞻性断言,如下所示

\[cigar].*?\[\/cigar\](?!\s*\[\/)


(?!\s*\[\/)
反向前瞻断言,匹配后会出现任何空格,但不会出现一个或多个空格,后面还会出现
[/
符号。

取决于您正在做什么,这并不重要

假设我正在编写BBCode解析器,我要处理这个问题:
[b][b][b]出于某种原因,三倍加粗![/b][/b][/b]

所以我有一个正则表达式,比如说
/\[b\](.*?\[\/b\]/
=>
“$1”

如果我重复应用替换,直到它不再改变任何东西,结果是:
出于某种原因,三倍加粗!

就浏览器而言,我有三个完全有效的嵌套元素,即使在解析它们时,我并不是从外到内进行分析


另一种选择是从最后一个匹配到第一个。这将通过
/\[b\](.*?\[\/b\](?!.\[b\])/


这将匹配最后一个
[b]
,以及它后面的第一个
[/b]
,换句话说,最里面的嵌套对。同样,重复应用程序直到没有任何更改都将导致所有对被解析,但这一次它们实际上将以“正确”的顺序被解析。(请注意,上面的正则表达式在大量输入时可能速度慢或效率低-请小心使用)

在此处发布输入和正则表达式。它位于该链接上,但ok,ok PostedTanks@Raj此字符串有任何解决方案吗?[雪茄][雪茄][雪茄][雪茄]ceva[/雪茄][雪茄][雪茄][雪茄]alceva[/雪茄][雪茄][雪茄]?结果是1个匹配,应该是2个匹配
[cigar] [cigar] [cigar] ceva [/cigar]
\[cigar].*?\[\/cigar\](?!\s*\[\/)