我正在寻找一个在php中使用的正则表达式(可能还有preg替换?),它在文本中删除所有未关闭的<
并且仅打开未关闭的所有未开放的>
且仅打开未打开的文本。
一些例子:
<name> aaaaaa bbbbb < aagfetfe <aaaa/>
to
<name> aaaaaa bbbbb aagfetfe <aaaa/>
<<1111>sbab < amkka <pippo>
to
<1111>sbab amkka <pippo>
<1111> aaaa < thehehe > aaaaaa <ciao>
to
<1111> aaaa < thehehe > aaaaaa <ciao>
<1111> aaaa thehehe > aaaaaa <ciao>
to
<1111> aaaa thehehe aaaaaa <ciao>
<1111> aaaa thehehe < aaaaaa
to
<1111> aaaa thehehe aaaaaa
我真的不能这样做对我来说太难了。
答案 0 :(得分:7)
$s = preg_replace("/<([^<>]*)(?=<|$)/", "$1", $s); # remove unclosed '<'
$s = preg_replace("/(^|(?<=>))([^<>]*)>/", "$1", $s); # remove unopened '>'
你明白为什么吗?
答案 1 :(得分:3)
对于未关闭的<
,您可以用空字符串替换<(?=[^>]*(<|$))
。它匹配在下一个<
或行尾之前未跟随结束>
的所有<
。 “未跟随”是positive lookahead。
对于未开启的>
,您可以将((^|>)[^<]*)>
替换为$1
。它匹配以>
(或行开头)开头的文本,不包含<
,以>
结尾。 $1
代表除了上一个>
之外的所有内容。