2

我正在为我的博客改进我的基本 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>
4

3 回答 3

1

假设您的正则表达式没问题,它应该是:

return preg_replace($pattern,$replacement,$pre_content[1]);//note the second element of the array [1]
于 2013-03-14T21:18:09.980 回答
0

根据要求,这应该将双换行符转换为段落标签,除了那些在预格式化标签内的双换行符:

$sourcestring="your source string";
echo preg_replace('#\n\n(?!((?!<pre>).)*</pre>)#is','</p><p>',$sourcestring);

在这里进行了测试,稍微修改了模式以解释换行符,该工具包括:http ://www.myregextester.com/?r=a24b18cf

于 2013-03-14T22:58:26.690 回答
0

尝试这个:

/**
 * Converts a new-line delimited string (with embedded HTML PRE tags) to
 * HTML paragraphs, preserving the newline delimiters within the PRE.
 * @param string $str
 * @return string
 */
function pFormat( $str )
{
    $a = explode( "\n", $str );
    $out = array();
    $isPre = FALSE;
    $lastBlank = FALSE;
    for( $i = 0, $l = count( $a ); $i < $l; $i++ )
    {
        $line = trim( $a[$i] );
        if( empty( $line ) )
        {
            if( $isPre )
            {
                $out[] = "";
            }
            continue;
        }
        if( substr( $line, 0, 4 ) == '<pre' )
        {
            $isPre = TRUE;
            $out[] = $line;
            continue;
        }
        if( substr( $line, 0, 5 ) == '</pre' )
        {
            $out[] = $line;
            $isPre = FALSE;
            continue;
        }
        $out = '<p>' . $line . '</p>';
    }
    return implode( "\n", $out );
}
于 2013-03-14T21:20:16.710 回答