有人可以解释一下这个正则表达式的含义吗?
$html = preg_replace("# <(?![/a-z]) | (?<=\s)>(?![a-z]) #exi", "htmlentities('$0')", $html);
有人在How to strip tags in a safer way than using strip_tags function?添加了它,但我无法理解。
这是我关于stackoverflow的第一篇文章,所以如果我犯了什么错误,请原谅我。
谢谢!
答案 0 :(得分:2)
#...# the # and # are just characters to start en end a REGEX
(you can use a lot of character for this)
#exi the e, x and i flags. See the PHP.net site for information
about it
< the < character
(?!...) a negative lookahead. The REGEX matches when the characters
after this are NOT equal to one of those
[/a-z] a character class, matches for the / character and the
letters a - z
| OR
(?<=\s) a positive lookbehind. The REGEX maches when there is
\s (whitepspace) before
> the > character
(?![a-z]) negative lookahead for the letters a - z
基本上,它匹配所有未用作标记的<
和>
个字符。例如,<foo
和</foo
将不匹配,foo>
也不会匹配。但是1 < 3
会匹配。这将传递给htmlentities
函数并变为1 < 3
。现在,您可以使用strip_tags
保存仅删除标记。
答案 1 :(得分:0)
在我看来,它试图根据&lt;之后的后续字符来确定什么不是HTML标签。或者&gt;是一个数字。
这意味着它将捕获<
:
<span>This is <5 ml.</span>
并将其替换为与该字符等效的HTML实体,允许您安全地使用strip_tags
而不破坏字符串的含义(如您引用的问题中所述)。
答案 2 :(得分:0)
查找未跟<
a-z
或
空格后跟>
,后跟a-z
然后将其替换为htmlentities('$0')
,其中$ 0是您的全部匹配!
i
选项忽略大小写
e
执行正常替换
x
忽略文字空格