gpt4 book ai didi

php - 使用正则表达式删除相同类型的 html 嵌套标签的最终解决方案?

转载 作者:行者123 更新时间:2023-12-01 13:43:31 25 4
gpt4 key购买 nike

我已经花了几天时间试图找到一个使用正则表达式的解决方案(在有人说之前:我知道我应该使用 PHP DOM 文档库或类似的东西,但让我们把它作为一个理论问题),寻找答案,我终于来了与我将在这个问题结束时展示的内容相提并论。

以下只是我之前尝试过的很多事情的总结。

首先,我所说的相同类型的嵌套标签是指:

Text outside any div
<div id="my_id"> bla bla
<div>
bla bla bla
<div style="some style here">
lalalalala
</div>
</div>
I'm trapped in a div!
</div>
more text outside divs

<div>more divs here!
<div id="justbeingannoying">radiohead rules</div>
</div>

现在想象我想删除所有的 div 及其内容 使用正则表达式。所以预期的结果是:
Text outside any div
more text outside divs

第一个想法是匹配一切。以下正则表达式匹配具有属性(样式、id 等)的 div 标签:
/<div[^>]*>.*<\/div>/sig

当然,问题是这将匹配 一切在第一个“< div”的开头和最后一个“
”之间,因此它也会匹配“divs外的更多文本”(请在此处查看: https://regex101.com/r/iR8mY2/1),这不是我们(我)想要的。

这可以使用 解决U 修饰符 (不贪心)
/<div[^>]*>.*<\/div>/sigU

但随后我们会遇到比我们想要的少的问题:它只会从第一个“< div”到第一个“”匹配(因此,如果我们删除匹配项,除了一些不匹配的标签之外,还会有文本“我被困在一个 div 中!”,这是我们不想要的)。

所以,我找到了一个解决方案,它就像嵌套括号、方括号等的魅力:
/\[([^\[\]]*+|(?R))*\]/si

基本上,它的作用是找到一个左方括号,然后匹配任何 * 既不是左方括号也不是右方括号 * 或它的递归结构,找到一个右方括号。

我现在工作的是一个糟糕的解决方案:基本上,首先我用方括号替换所有开始标签(由于其他原因,它不能在我的代码中),然后是结束方括号的结束标签,然后我使用之前的正则表达式。 我知道,这不是一个非常优雅的解决方案。

问题是我真的很想知道如何只用一个正则表达式就可以做到这一点。显然比在之前的正则表达式中用 html 标签替换“[”和“]”必须起作用。
但并没有那么容易。问题是字符的否定 ("[^.......]"不适用于像 "div"这样的字符串。似乎可以通过以下方式实现类似的东西:
.+?(?=<div>)

当然,结束标记也是如此
.+?(?=<\/div>

这就是我或多或少地到达这个正则表达式的方式
/<div((.+?(?=<\/div>)|.+?(?=<div>))|(?R))*<\/div>/gis

这与 完全一样第一 我之前介绍过的正则表达式: https://regex101.com/r/yU8pV3/1

所以,这是我的问题: 那个正则表达式有什么问题 ?

谢谢!

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com