我正在使用BBCode的网站上使用格式工具栏,并在回显我的内容之前使用以下代码解析某些格式标记:
$content = htmlspecialchars($row['postContent'], ENT_QUOTES);
//Parse BB Code
$patterns = array
(
"#\[b\](.*?)\[\/b\]#",
"#\[i\](.*?)\[\/i\]#",
"#\[u\](.*?)\[\/u\]#",
"#\[quote\](.*?)\[\/quote\]#"
);
$replacements = array
(
"<b>$1</b>",
"<i>$1</i>",
"<u>$1</u>",
"<blockquote class=\"user-quote\"><p class=\"quote-text\">$1</p></blockquote>"
);
$content = preg_replace($patterns, $replacements, $content);
我遇到的问题是最终标签没有在适当的位置回显。我目前在以下HTML内回显了所有$row['postContent']
:
<div class="text">
<p id="'.$row['postID'].'">
'.$content.'
</p>
</div>
所有格式标签(包括我在本文中未显示的其他格式标签)都放在<p id="blah"></p>
元素中,因此根据我对段落元素的CSS样式进行格式化。由于某些原因,<blockquote class=\"user-quote\"><p class=\"quote-text\">$1</p></blockquote>
在这些标签之后被回显,当我在检查器中查看代码时,它看起来像:
<div class="text">
<p id="blah">
</p>
<div class="user-quote">
::before
<p class="quote-text">foo bar</p>
::after
</div>
</div>
足够奇怪的是,如果我查看页面的源代码,它似乎可以正确地回显,但是在检查器中却不是这种情况,并且在我的页面上看起来确实是不正确的,特别是如果我包含的常规文本不在BBCode标签内。如果这样做,div末尾会出现一个奇怪的“幻影” <p></p>
:
<div class="text">
<p id="blah">
</p>
<div class="user-quote">
::before
<p class="quote-text">foo bar</p>
::after
</div>
"
here is some non-formatted text
"
<p></p>
</div>
我尝试了很多事情,例如删除某些CSS样式(我以为::before
或::after
是罪魁祸首),然后将标签从<blockquote>
更改为{{1 }},但没有任何效果。为什么会发生这种情况?也许我的疲劳使我错过了一些显而易见的事情。
如果有帮助,这就是我要从数据库中回显的确切内容:
<div>
[EDIT]如果我切换内容的格式...
[quote]some text[/quote]
here is some non-formatted text
...然后产生正确的结果。我仍然不确定为什么这样,或者为什么其他格式会产生错误的结果。我当然希望用户能够在quote标记后发布常规文本。
答案 0 :(得分:1)
您已经通过说出if I view the source code for the page it appears to be echoed correctly, but this isn't the case in the inspector,
HTML检查器不是用于生成页面的HTML,而是浏览器如何设法确定需要显示的内容。
如果您查看“ P”元素的规范-https://developer.mozilla.org/en-US/docs/Web/HTML/Element/p-您会发现,如果在<p>
后面加上<blockquote>
,则假定<p>
为关闭,因此您会在检查器<p></p><blockquote>blah</blockquote>
中看到(紧跟着</p>
,它不知道要做什么,可能会使用或已丢弃,并且可能不会在检查器中显示-不太确定)。