PHP html metin listeleri dönüştüren bir regex

4 Cevap php

Ben metin bloğunu dönüştürmek için bir regexpi kod çalışıyorum:

* List item
* Another list item

html:

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

Bunu yapmak için parçacıkları veya sınıfları (Markdown, Tekstil, vb) var biliyorum ama overkill olduğunu düşünüyorum: Ben gerçekten sadece bazı temel işlevleri istiyorum. Şimdiye kadar ben çalışıyorum:

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

Ama

    her şeyi sarmak için nasıl bilmiyorum Ayrı kullanmadan etiket gibi değiştirin:

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

    Bu örnek, sıralı listeler için, diğer koduyla uğratır. Daha iyi bir yolu olmalı.

    Teşekkürler.

4 Cevap

Bu soruya, nereye kullandığınız kod öylesine gibi orada bir kırılma olması varsayalım bile tek ul etiketi li etiketleri birden fazla setleri örtecek aslında bahsediyoruz eğer:

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

Olacak:

<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>

Sonra sizin için bir çözüm var. Burada ben ile geldi bir çözümdür (ama ben zaten zaten münhal eminim), orada o 90% vardı:

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

Çözümü zaten sayfadaki metin veya ne olursa olsun her türlü listeleri ile karmaşa değil ve çoklu listeleri ayrı emin kılar. Nedeni bir yıldız, bir ul ve li sonra 2. hat kapanma ve açılma ul etiketleri arka arkaya tüm bulur ve onları kaldırır çevreleyen bir metin liste öğesi oluşturmak için kullanılan nerede her maç bulduğu olmasıdır.

Neden preg_match_all ile bir dizi ilk regex depolamak ve bu gibi tutkal yok:

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

Peki, sadece yapabileceği

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

ya da, gerçekten kullanmak istiyorsanız preg_replace

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

Belki PHP Markdown yararlı olabilir.