Я пытаюсь закодировать 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);
Это мешает другому коду, например, упорядоченным спискам. Должен быть лучший способ.
Благодарю.
В этом вопросе, если вы говорите о том, что код, который вы использовали, будет обертывать несколько наборов тегов 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 полезным.