2

ブログの基本的なCMSを改善しています。今日、データベース内の(double)改行を段落タグに変換する新しい関数を追加しました。

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 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 に答える