4

したがって、実際にはhtmlフィールドを格納していますが、公開しやすくするためにいくつかの疑似タグを追加したいと思います。IEタイトル/ヘッダーをこのタグにラップしたい:<< ... >> EG <<マイヘッダー>>次に、それらを列挙し、フォーマットして、下のテキストを表示します。

例えば:

<<News>>
Breaking news on Sunday.
Have been taking hostages.
<<General Information>>
We would want to recieve our blabla.
And you want it.
<<User Suggestions>>
Yeah we want it so much...

実際に表示する必要があります:

<H1 class="whatever" ID="Product_Header_1">News<H1>
Breaking news on Sunday.
Have been taking hostages.
<H1 class="whatever" ID="Product_Header_2">General Information</H1>
We would want to recieve our blabla.
And you want it.
<H1 class="whatever" ID="Product_Header_3">User Suggestion</H1>
Yeah we want it so much...

次に、実際のヘッダーとその番号を含む配列を返す必要があります。これにより、ページの他の場所で参照を行うことができます。

したがって、それらを直接置き換えることもできるようですが、値の列挙と戻りに問題が生じる可能性があり、閉じていないタグの場合はおそらく失敗します。

または、それらを配列に分割してから手動で続行することもできます。これは、より良い方法のようです。

これは私がこれまでに試したことです:

$TEXT_A=preg_split('/<<([^>]+)>>/', $TEXT);

foreach($TEXT_A as $key => $val){
    if ($key>0) echo "<br>-!-";
    echo $val;
}

$ TEXTは、疑似タグ付きのHTMLテキストです。

ただし、問題は、splitが正規表現の一致自体を返さないため、それを抽出する方法に戸惑っています。通常の分割ではなく、テキストとヘッダーの配列を返すカスタム関数を作成する必要があるかもしれませんが、どこから始めればよいのかわかりません...

助けてください。

4

5 に答える 5

2

使用するだけ

$text_a = preg_split('/<<([^>]+)>>/', $text, -1, PREG_SPLIT_DELIM_CAPTURE);

ヘッダータグは、の奇数インデックスにあり$text_aます。最初のヘッダーの前にあるものを無視したいとします。

$n = count($text_a);
$head_a = array();
$body_a = array();
for ($i = 1; $i < $n; $i += 2) {
   $head_a[] = $text_a[$i];
   $body_a[] = $text_a[$i + 1]; // trim()?
}
于 2012-06-11T21:58:45.420 に答える
1

これは、を使用した実用的なソリューションpreg_replace_callbackです。(?=<<|$)「本文」のテキストをキャプチャするために、貪欲でないキャプチャグループとポジティブな先読み()を組み合わせて使用​​します。ポジティブルックアヘッドは、「開始区切り文字<<または文字列の終わりのいずれかが$存在することを表明する」と述べています。

$count = 0;
$TEXT_A = preg_replace_callback( '/<<([^>]+)>>(.*?)(?=<<|$)/s', 
    function( $matches) use (&$count) {
        $count++;
        return '<H1 class="whatever" ID="Product_Header_' . $count . '">' . $matches[1] . '</H1>' . "\n" . trim( $matches[2]) . "\n\n"; 
}, $TEXT);
echo htmlentities( $TEXT_A);

生成されたHTMLを表示するためにhtmlentitiesに渡しましたが、もちろんその呼び出しを削除して、ブラウザーによってHTMLが解釈されることを確認できます。

<H1 class="whatever" ID="Product_Header_1">News</H1>
Breaking news on Sunday.
Have been taking hostages.

<H1 class="whatever" ID="Product_Header_2">General Information</H1>
We would want to recieve our blabla.
And you want it.

<H1 class="whatever" ID="Product_Header_3">User Suggestions</H1>
Yeah we want it so much...

デモ

編集:

これが無名関数のないソリューションです:

function do_replacement( $matches){
    static $count = 0;
    $count++;
    return '<H1 class="whatever" ID="Product_Header_' . $count . '">' . $matches[1] . '</H1>' . "\n" .
    trim( $matches[2]) . "\n\n";    
}

$TEXT_A = preg_replace_callback( '/<<([^>]+)>>(.*?)(?=<<|$)/s', 'do_replacement', $TEXT);
echo htmlentities( $TEXT_A);

最終編集

この編集には、置換をキャプチャするためのグローバル配列が含まれています。

$custom_array = array();
function do_replacement( $matches){
    global $custom_array;
    static $count = 0;
    $count++;
    $custom_array[$count] = $matches[1];
    return '<H1 class="whatever" ID="Product_Header_' . $count . '">' . $matches[1] . '</H1>' . "\n" .
    trim( $matches[2]) . "\n\n";    
}

$TEXT_A = preg_replace_callback( '/<<([^>]+)>>(.*?)(?=<<|$)/s', 'do_replacement', $TEXT);
echo htmlentities( $TEXT_A);

var_dump( $custom_array);
于 2012-06-11T22:05:50.730 に答える
1

HTMLではなく、マークアップ形式を使用してドキュメントを作成したいようです。

これは非常に一般的な要件であり、人々がすでに思いついたこのための多くの解決策があります。独自のマークアップ形式も作成する場合は問題ありませんが、少し時間を節約したい場合は、既存の形式の1つを検討することをお勧めします。

頭から離れて、BBCode、Markdown、Wikicodeについて考えることができます。

  • マークダウンは、このサイトの質問/コメントで使用される形式です。
  • BBCodeは、多くのフォーラムソフトウェアなどでさまざまな形で使用されています。
  • ウィキコードは、ウィキペディアや他のウィキサイトで使用されるマークアップコードです。

パーサーは、PHPおよび他の言語でこれらすべてに使用できます。

たとえば、PHPのPECLライブラリで利用可能なBBCodeパーサーがあります-ここを参照してください:http://php.net/manual/en/book.bbcode.php。PECLライブラリをサーバーにインストールできる場合は、実行時に何も含めなくても、これらのBBCode解析関数をPHPで使用できます。

PECLルートにアクセスできない場合は、他のBBCodeパーサーも存在します。たとえば、http://nbbc.sourceforge.net/を試してください。

ウィキマークアップパーサー:ウィキペディアはどのウィキマークアップパーサーを使用しますか?

マークダウンパーサー: http: //michelf.com/projects/php-markdown/

お役に立てば幸いです。

于 2012-06-11T22:07:20.770 に答える
0

正規表現ではありませんが...:

$s = '<<News>>
Breaking news on Sunday.
Have been taking hostages.
<<General Information>>
We would want to recieve our blabla.
And you want it.
<<User Suggestions>>
Yeah we want it so much...';

$s = str_replace('>>', '<H1>', $s);
$i = 1;
while (strpos($s, '<<') !== false)
{
    $s = str_replace_one('<<', '<H1 class="whatever" ID="Product_Header_' . $i . '">', $s);
    $i++;
}

function str_replace_one($find, $replace, $subject) 
{
    return implode($replace, explode($find, $subject, 2));
}


echo $s;
于 2012-06-11T22:05:03.150 に答える
0

代わりに preg_replace_callback を使用しないのはなぜですか?

preg_replace_callback('/<<([^>]+)>>/', function($match) {
    static $key=0;
    $html = (($key > 0) ? '<br>-!-' : '') . '<H1 class="whatever" ID="Product_Header_'.$key.'">'.$val.'</H1>';
    $key++;
    return $html;
});
于 2012-06-11T22:09:26.620 に答える