正则表达式:去除未闭合的<

5
我需要一个正则表达式,在php中使用(可能是preg_replace),它可以从文本中去除所有未关闭的<标签,而且只能去除未关闭的标签,同时也要去除所有未打开的>标签,而且只能去除未打开的标签。
以下是一些示例:

1

<name> aaaaaa bbbbb <  aagfetfe <aaaa/>
to
<name> aaaaaa bbbbb   aagfetfe <aaaa/>

2

<<1111>sbab  < amkka <pippo>
to
<1111>sbab   amkka <pippo>

3

<1111> aaaa <    thehehe  > aaaaaa <ciao>
to
<1111> aaaa <    thehehe  > aaaaaa <ciao>

4

<1111> aaaa   thehehe  > aaaaaa <ciao>
to 
<1111> aaaa   thehehe   aaaaaa <ciao>

5

<1111> aaaa   thehehe  < aaaaaa
to 
<1111> aaaa   thehehe   aaaaaa

我真的做不到,这对我来说太难了。


1
也许只需要将SPACE>替换为SPACE,将<SPACE替换为SPACE - Benoit
我想问一个关于参数的问题。目前我的问题是,我得到了像 <a href="http:/... <a href="#">阅读更多</a> 这样的东西,它会破坏我的整个 HTML 结构。有没有关于参数的想法?谢谢! - Tommy B.
2个回答

7
$s = preg_replace("/<([^<>]*)(?=<|$)/", "$1", $s); # remove unclosed '<'
$s = preg_replace("/(^|(?<=>))([^<>]*)>/", "$1", $s); # remove unopened '>'

你明白为什么吗?


1
非常好 - 我花了几分钟才理解。 - Karl Barker
我喜欢 Stack Overflow,你是最棒的。 - user1237899

3
对于未闭合的<,您可以用空字符串替换<(?=[^>]*(<|$))。它匹配所有在下一个<或行尾之前没有被紧随着一个闭合><。"not followed by" 是一个positive lookahead
对于未打开的>,您可以将((^|>)[^<]*)>替换为$1。它匹配以>(或行开头)开始,不包含<并以>结尾的文本。$1代表除最后一个>之外的所有内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接