2

ユーザーが特定のコマンドを記述してhtmlを取得できるテキストフィールドがあります。

例えば:

Text Text Text Text

[*] first entry
[*] second entry
[*] 3rd...

Text Text

このテキストは正規表現で次のように変換する必要があります。

text text

<ol>
 <li>FirstEntry</li>
 <li>Second</li>
 ..
</ol>

text text

なにか提案を?

エントリのある行に一致する正規表現は、次のようなものです。

/\[\*\].+/i

問題は<ol>、とを正しく挿入する方法です。</ol>

私の解決策

テキストのすべての行を解析できると考えていましたが、パーサーが [*] で始まる最初の行に遭遇すると<ol></ol>

これまで、single[*] ...を single に変換するスクリプトを作成しました。<li> ...

http://codepad.org/yzRVupON

preg_replace('/\[\*\](.+)/i','<li>$1</li>',$str);

私はその<ol>部分が必要です

私の実装

http://codepad.org/NNgC6uko

4

3 に答える 3

2

この種の構文解析を正規表現で行うのは、おそらく適切ではありません。非常に単純なシナリオでは問題ないかもしれませんが、追加しようとする機能が多ければ多いほど、メンテナンスが不可能になるまで難しくなります。

たとえば、さまざまな MarkDown パーサーから解析手法を借りることをお勧めします。詳細については、これらの 質問を参照してください (他にもあります)。

元の質問に戻る: 正規表現のみを使用するように制限されている場合は、最初に「リスト ブロック」全体を次のようなものと一致させることができます。

/^(\s*\[\*\].*?$)+/m

(複数行モード修飾子は必須です)

次に、一致したテキストを現在の正規表現で個々のリスト項目に分割し、結果を で囲むことにより、出力を生成できます<ol></ol>

于 2012-11-10T15:07:02.527 に答える
1

それが私の実装です。作業コード:http ://codepad.org/NNgC6uko

このスクリプトは、コマンドからHTMLへのあらゆる種類の変換で簡単にカスタマイズできます

function parseText($txt) {

    $lines = preg_split('/[\r\n]+/',$txt,null,PREG_SPLIT_NO_EMPTY);
    $newLines = array();

    $lastTag = '';
    foreach($lines as $k=>$v) {

        $currentTag = $v[0];

        //$newLine = $v;
        $newLine = preg_replace('/^\* (.+)$/','<li>$1</li>',$v);

        if ($currentTag=='*' && $lastTag != '*')
            $newLines[] = '<ol>';

        else if ( $lastTag == '*' && $currentTag != '*' )
            $newLines[] = '</ol>';  

        $newLines[] = $newLine;



        $lastTag = $currentTag;

    }

    print_r($newLines);
}
于 2012-11-10T15:42:20.147 に答える
1

preg_replace両サイドにタグを付けてみませんか?下のようなものかな。

$string = <<<EOF
Text Text Text Text

[*] first entry
[*] second entry
[*] 3rd...

Text Text
EOF;

$pattern = '/(\[\*\])([\d\D]+)(\[\*\].*)/';
$replacement = '<ol> ${1}${2}${3} </ol>';
$string = preg_replace($pattern, $replacement, $string);

$pattern = '/\[\*\](.+)/i';
$replacement = '<li>${1}</li>';

echo  preg_replace($pattern, $replacement, $string);

出力:

Text Text Text Text

    <ol>
        <li> first entry </li>
        <li> second entry </li>
        <li> tag 3rd... </li>
    </ol>

Text Text
于 2012-11-10T15:06:59.643 に答える