Регулярное выражение, которое преобразует текстовые списки в HTML в PHP - PullRequest
7 голосов
/ 26 февраля 2010

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

* 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);

Но я не знаю, как обернуть все в теги

Ответы [ 4 ]

13 голосов
/ 04 февраля 2011

В этом вопросе, если вы говорите о том факте, что код, который вы использовали, обернул бы несколько наборов тегов 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 спина к спине и удаляет их.

1 голос
/ 26 февраля 2010

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

$list='<ul><li>';
$list .= implode('</li><li>',$arr_regex);
$list .= '</li></ul>';
0 голосов
/ 27 февраля 2010

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

0 голосов
/ 26 февраля 2010

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

$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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...