剥离未封闭的正则表达式

时间:2012-02-28 12:52:23

标签: php regex

我正在寻找一个在php中使用的正则表达式(可能还有preg替换?),它在文本中删除所有未关闭的<并且仅打开未关闭的所有未开放的>且仅打开未打开的文本。

一些例子:

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

我真的不能这样做对我来说太难了。

2 个答案:

答案 0 :(得分:7)

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

你明白为什么吗?

答案 1 :(得分:3)

对于未关闭的<,您可以用空字符串替换<(?=[^>]*(<|$))。它匹配在下一个<或行尾之前未跟随结束>的所有<。 “未跟随”是positive lookahead

对于未开启的>,您可以将((^|>)[^<]*)>替换为$1。它匹配以>(或行开头)开头的文本,不包含<,以>结尾。 $1代表除了上一个>之外的所有内容。