排除括号标签

时间:2014-08-20 21:54:14

标签: php regex

我试图创建一个正则表达式来选择标签之间的所有内容,而不是大胆的内容,如下所示:

[capti id="attachment_2231" align="alignnone" width="950" caption="ABC"]AEAEAEASEASEA[/caption] ***ABCDEFGHIJKLMN*** [capti id="attachment_2231" align="alignnone" width="950" caption="ABC"]AEAEAEASEASEA[/caption]

我尝试的正则表达式是\[([a-z]|[A-Z])* (.*)\[\/([a-z]|[A-Z])*\],但它会选择所有内容,包括粗体内容。

我能做些什么吗?

非常感谢。

2 个答案:

答案 0 :(得分:0)

正则表达式可能不是最佳解决方案,但您需要使用延迟匹配来限制匹配的字符数量,因此.*将成为.*?

此外,通过匹配所有字符直到结束标记来简化标签的选择:

\[[^\]]+\](.*?)\[\/[^\]]+\]

请参阅regex101上的example

答案 1 :(得分:0)

我认为比使用正则表达式更好的选择是使用空字符串替换粗体文本,然后保留剩余内容。

$string = '[capti id="attachment_2231" align="alignnone" width="950" caption="ABC"]AEAEAEASEASEA[/caption] ***ABCDEFGHIJKLMN*** [capti id="attachment_2231" align="alignnone" width="950" caption="ABC"]AEAEAEASEASEA[/caption]';
$pattern = '/\*{3}\w+\*{3}/i';
echo preg_replace($pattern, "", $string);

// output
[capti id="attachment_2231" align="alignnone" width="950" caption="ABC"]AEAEAEASEASEA[/caption]  [capti id="attachment_2231" align="alignnone" width="950" caption="ABC"]AEAEAEASEASEA[/caption]

但是如果你想要一个正则表达式,你可以使用这样的一个:

(\[.*?\].*?\[.*?\])

<强> Working demo

MATCH 1
1.  [0-95]  `[capti id="attachment_2231" align="alignnone" width="950" caption="ABC"]AEAEAEASEASEA[/caption]`
MATCH 2
1.  [117-212]   `[capti id="attachment_2231" align="alignnone" width="950" caption="ABC"]AEAEAEASEASEA[/caption]`