2

指定された文字列でリストブロックを生成しようとしています。*で始まるすべての行をリストに変換したいと思います。例えば:

Text...
* One
* Two
Other text.

私はphp正規表現でそれを行いました。

$source=preg_replace("/^\*([^\n]*)/m","<li>$1</li>",$source);

作成したすべてのliグループを「ul」タグで囲むにはどうすればよいですか。「li」行が3行、「li」行が10行のブロックなどである可能性があります...
「NOT </ li> + <li> +(WHATEVER)+ </ li> +(NOT <li>) "、しかしこれは不可能です。

4

2 に答える 2

0

あなたの質問を正しく理解したかどうかはわかりませんが、これは次のとおりです。 $source = preg_replace('/\* ([^\r\n]+)/', '<li>$1</li>', $source);

変換します:

* Test1
* Test2
* Test3
* Test4

の中へ:

<li>Test1</li>
<li>Test2</li>
<li>Test3</li>
<li>Test4</li>

編集: $source = preg_replace('<li>(.+)</li>', '<ul><li>$1</li></ul>', preg_replace('/\* ([^\r\n]+)/', '<li>$1</li>', $source));

<li>...またはsを囲みます<ul>

于 2012-06-15T15:28:45.710 に答える
0

<li>...</li>要素の連続するペアを一致させ、それらを次のようにラップする必要があり<ul>ます。

preg_replace('#((?:<li>.*?</li>\s*)+)#', '<ul>\1</ul>', $source);

内側の(?: ... )グループは1つに一致<li> ... </li>し、オプションで空白が続きます。この全体の一致は、少なくとも1回は存在する必要があります。

ところで、は?:何にも一致しません。これは、周囲のグループに後方参照用のメモリスロットを割り当ててはならないことを示すために使用されます。

貪欲でないものを使用することにより、これは'sの.*?別々のセクションに一致することができます。<li>

Text...
* One
* Two
Other text.
* Three
* Four

問題があれば教えてください。

于 2012-06-15T16:14:53.160 に答える