Регулярное выражение, преобразующее текстовые списки в html в PHP

Я пытаюсь закодировать regexp для преобразования блока текста:

* List item * Another list item 

к html:

 <ul> <li>List item</li> <li>Another list item</li> </ul> 

Я знаю, что для этого есть фрагменты или классы (Markdown, Textile и т. Д.), Но я думаю, что это слишком сложно: мне просто нужны некоторые базовые функции. Пока я пытаюсь:

 $text = preg_replace("/\*+(.*)?/i","<li>$1</li>",$text); 

Но я не знаю, как обернуть все в теги <ul>, не используя отдельную замену, например:

 $text = preg_replace("/(\<li\>(.*)\<\/li\>\n*)+/is","<ul>\n$1\n</ul>\n",$text); 

Это мешает другому коду, например, упорядоченным спискам. Должен быть лучший способ.

Благодарю.

Solutions Collecting From Web of "Регулярное выражение, преобразующее текстовые списки в html в PHP"

В этом вопросе, если вы говорите о том, что код, который вы использовали, будет обертывать несколько наборов тегов li в один тег ul, даже если бы предполагалось, что это будет разрыв:

 * line 1 * line 1 * line 1 this is not part of a list * line 1 * line 1 * line 1 

Станет:

 <ul> <li>line 1</li> <li>line 1</li> <li>line 1</li> this is not part a the list <li>line 1</li> <li>line 1</li> </ul> 

Тогда у меня есть решение для вас. У вас там было 90%, вот решение, которое я придумал (но я уверен, что вы все равно его решили):

 $text = preg_replace("/\*+(.*)?/i","<ul><li>$1</li></ul>",$text); $text = preg_replace("/(\<\/ul\>\n(.*)\<ul\>*)+/","",$text); 

Решение не путается со списками любого типа, которые уже есть на странице в тексте или что-то еще, и позволяет разделить несколько списков. Причина в том, что в каждом совпадении, где была найдена звездочка, для создания элемента текстового списка, который он окружает, с помощью ul и li, тогда вторая строка находит все обратные к закрытию и открытию ul-тегов и удаляет их.

Почему бы вам не сохранить первое регулярное выражение в массиве с preg_match_all и приклеить его так:

 $list='<ul><li>'; $list .= implode('</li><li>',$arr_regex); $list .= '</li></ul>'; 

Ну, вы могли бы просто сделать

 $text = "<ul>" . preg_replace("/\*+(.*)?/i","<li>$1</li>",$text) . "</ul>"; 

или, если вы действительно хотите использовать preg_replace

 $text = preg_replace("/(\<li\>(.*?)\<\/li\>\n*)+/is","<ul>\n$1\n</ul>\n",$text); 

Возможно, вы можете найти PHP Markdown полезным.