我正在用 PHP 开发 Telegram Bot,我必须在其中处理仅允许使用一些基本 HTML 标记和 All的字符串<
,>
并且&
必须将不属于标记或 HTML 实体的符号替换为相应的 HTML 实体(<
with <
, >
with>
和&
with &
)
示例字符串
<b>bold</b>, <strong>bold</strong>
<i>italic</i>, <em>italic</em>
<a href="http://www.example.com/" >inline URL</a>
<code>inline fixed-width code</code>
<pre>pre-formatted fixed-width code block</pre>
yes<b bad<>b> <bad& hi>;<strong >b<a<
我设法替换&
并<
使用正则表达式。例如,我在此模式中使用负前瞻<(?!(?:(?:\/?)(?:(?:b>)|(?:strong>)|(?:i>)|(?:em>)|(?:code>)|(?:pre>)|(?:a(?:[^>]+?)?>))))
来摆脱<
符号。
但是我无法构建一个模式来替换>
不属于任何标签的符号。PCRE 不支持后视中的不定量词。尽管它允许lookbehinds 中的备选方案具有不同的长度,但要求每个备选方案具有固定长度。
所以,我尝试使用这种模式(仍然不完整)(?<!(?:(?:<b)|(?:<strong)|(?:<i)|(?:<em)|(?:<code)|(?:<pre>)|(?:<a)))>
,其中所有替代方案都有固定的长度,但它仍然说Compilation failed: lookbehind assertion is not fixed length