我正在为我的博客改进我的基本 CMS。今天我添加了一个新功能,它将数据库中的(双)换行符转换为段落标签。
function nl2p($str) {
$pattern = '/\n\n/';
$replacement = '</p><p>';
return preg_replace($pattern, $replacement, $str);
}
这很好用,除了我不想<p>
在我的标签中添加任何<pre>
标签。所以我想我会扩展我的功能以将所有这些<p>
标签重新转换为换行符,但它不起作用。关于为什么的任何想法?
function nl2p($str) {
$pattern = '/\n\n/';
$replacement = '</p><p>';
$par = preg_replace($pattern, $replacement, $str);
preg_match_all('/\<pre\>(.*?)\<\/pre\>/', $par, $pre_content);
return preg_replace($replacement, $pattern, $pre_content[0]);
}
编辑:由于这似乎很难破解,也许我应该在我的代码中添加一些上下文。我正在使用语法荧光笔在我的博客上以原始格式显示代码。荧光笔是用 Javascript 编写的,并利用 HTML 中预先格式化的标签来显示代码。
另外,我上面的 nl2p 函数是我博客类的一个方法。问题是它使用我的预格式化标签以原始格式(即可见)放置预格式化标签。
编辑 2:这是一些示例代码。首先是数据库中的原始代码,然后是格式化的 HTML 代码。另一个奇怪的细节是,下面代码中的最后一个</p>
在源代码中实际上是不可见的。它出现在结束的 pre 标记之后。
<pre name="code" class="brush: javascript">
var data = [10, 20, 30];
var svg = d3.select("body")
.append("svg")
.attr("width", 500)
.attr("height", 500);
var circle = svg.selectAll("circle")
.data(data)
.enter()
.append("circle")
.attr("cx", function (d) { return d * 10; })
.attr("cy", 50)
.attr("r", function (d) { return d; })
.style("fill", "red");</pre>
----------
var data = [10, 20, 30];<p></p><p>var svg = d3.select("body")
.append("svg")
.attr("width", 500)
.attr("height", 500);
var circle = svg.selectAll("circle")
.data(data)
.enter()
.append("circle")
.attr("cx", function (d) { return d * 10; })
.attr("cy", 50)
.attr("r", function (d) { return d; })
.style("fill", "red");</p>