【问题标题】:Strip string of anything inside pointy brackets去掉尖括号内的任何东西的字符串
【发布时间】:2015-06-01 18:18:49
【问题描述】:

我有一个字符串,例如:

$string = '[caption]text text[/caption] Hello';

我想删除括号和括号内的任何内容,以便字符串为:

$string = ' Hello';

在 PHP 中,最好的方法是什么?我应该使用什么正则表达式?

【问题讨论】:

  • 正则表达式。正则表达式将是做到这一点的最佳方式。
  • 相当于BBCode,见:stackoverflow.com/questions/6777257/…
  • 试着做一个正则表达式,贴出来,我们会帮你改正的。
  • 操作系统 > 找到鼠标指针 > 找到浏览器 > 打开浏览器 > 去谷歌 > 寻找“regex php text between tags” > 复制解决方案 > 利润。

标签: php regex


【解决方案1】:

如果你的 BBcode 标签是平衡的并且没有嵌套,你可以使用一种简单的模式,比如建议的here,适用于所有类型的标签:

$string = '[caption]text text[/caption] Hello';
$string = preg_replace('~\[(\w+)[^]]*].*?\[/\1]~si', '', $string);

这里没什么难的,(\w+) 捕获标签的名称,\1 是对捕获的引用。

然而,一些 bbcode 风格接受像 [*] 这样的自闭合标签用于列表项,并且标签可以嵌套:

[caption]text [i]text[/i] text[/caption]
[LIST][*]item1[*]item2[/LIST]
[img]http://img.com/image.jpg[/img] <-- common syntax
[img=http://img.com/image.jpg] <-- self-closing syntax

有两种可能的解决方案来删除它们:

1) 多次通过的解决方案:

  • 您必须删除第一个自闭合标签:
    $str = preg_replace('~\[(?:\*|img=[^]]*)]~i', '', $str);

  • 然后在 while 循环中删除最里面的平衡标签及其内容,直到没有其他内容要删除:
    do { $str = preg_replace('~\[(\w+)[^]]*][^[]*\[/\1]~i', '', $str, -1, $count); } while ($count);

2) 一次性使用递归模式:

$pattern = '~
# subpattern definitions
(?(DEFINE)
    (?<scTag> \[ (?:\* | img=[^]]* ) ] ) # self-closing tags
    (?<bTag> \[(\w+)[^]]*] [^[]* (?: \g<Tag> [^[]* )*+ \[/\g{-1}] )
    (?<Tag> \g<scTag> | \g<bTag> )
)

# main pattern
\g<Tag>+
~xi';

$str = preg_replace($pattern, '', $str);

demo

注意:为了更严谨,您可以将\w+替换为bbcode标签的名称:(?:caption|font|[bis]...)

【讨论】:

  • 这真是太可爱了,真的非常感谢!
【解决方案2】:

尝试添加一个函数stripTag(String fullstr, String tagname)

这样称呼它:stripTag('[caption]asdf[/caption] hello', 'caption')

搜索 [tagName] 和 [/tagName]。使用 substr 构建一个新字符串,其中包含您找到的搜索区域之前和之后的输入部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-14
    • 1970-01-01
    • 2020-12-13
    • 2014-08-18
    • 2012-10-23
    相关资源
    最近更新 更多