Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Dla wyjadaczy Wyrażeń Regularnych
Forum PHP.pl > Forum > Przedszkole
id4
Witam

Dzisiaj mam coś dla wyjadaczy wyrażeń regularnych.
Jeśli ktoś mógłby mi pomóc, byłbym wdzięczny.

Potrzebuję zrobić coś takiego.

- W inpucie wpisuję tekst:
Kod
[ul]
jakieś info /enter/
inne info /enter/
jeszcze inne info /enter/
[/ul]


Chodzi mi teraz o to (zapewne większość sie domyśla), by kod pomiędzy [ul] a [/ul] był wypunktowany, czyli wyrażenie musiałoby zmienić kod na:

  1. <ul>
  2. <li>jakieś info</li>
  3. <li>inne info</li>
  4. <li>jeszcze inne info</li>
  5. </ul>


Czy jest to możliwe do zrealizowania przy pomocy jednego wyrażenia, a jeśli tak, to może ma ktoś takowe? Jeśli nie, to proszę o wskazówki odnoścnie jego napisania. Z góry dziękuję za pomoc.
bendi
  1. <?
  2. $s = '[ul]
  3. jakieś info
  4. inne info
  5. jeszcze inne info
  6. [/ul]';
  7. preg_match( '%[ul](.*?)[/ul]%si', $s, $a );
  8. echo '<ul><li>'.preg_replace( &#092;"%n+%\", '</li><li>', trim( $a[1] ) ).'</li></ul>';
  9. ?>
id4
Wielkie dzięki @bendi - bardzo mi to pomogło.
Reasumując jednak nie o to mi za bardzo chodziło. W Twoim przykładzie w stringu musi być wyliczenie, a w praktyce jest tam długi tekst, a w nim różne wyliczenia. Dlatego zmodyfikowalem trochę kod, ale nie udało mi się osiągnąć zamierzonego celu. Oto kod:

  1. <?php
  2. $string = preg_replace(&#092;"#[ul](.*?)[/ul]#si\", \"<ul><li>\".preg_replace(\"%n+%\",\"</li><li>\",\"1\").\"</li></ul>\", $string);
  3. ?>


W wyniku tego kodu otrzymuję coś takiego:

  1. <ul><li>
  2. 1
  3. 2
  4. 3
  5. 4
  6. 5
  7. </li></ul>


Może ma ktoś chęć zerknąć w mój kod i zmodzić go trochę?
Z góry dziękuję.

--------------------------
EDIT:
--------------------------

Udało mi się wymodzić takie wyrażenie:
  1. <?php
  2. $string = preg_replace_callback(&#092;"/[ul](.*?)[/ul]/si\", create_function('$func','return \"<ul><li>\".str_replace(\"-\",\"</li><li>\",$func[1]).\"</li></ul>\";'), $string);
  3. ?>


Dane wejściowe:
Kod
[ul]
-1
-2
-3
-4
-5
[/ul]


Niby działa dobrze, ale z założenia ma jeden błąd. Mianowicie zawsze na początku listy jest jeden wiersz pusty. Nie wiem jak to wyeliminować. Efekt jest taki:
  1. <ul>
  2. <li></li>
  3. <li>1</li>
  4. <li>2</li>
  5. <li>3</li>
  6. <li>4</li>
  7. <li>5</li>
  8. </ul>


Zawsze pierwszy wiersz jest pusty - jak to wyeliminować? Chodzi mo konkretnie o zmodyfikowanie tego jednego wiersza wyrażenia - bez dodatkowych funkcji zewnętrznych itp. Może ktoś potrafi tego dokonać?
hwao
a szybciej bedzie tak tongue.gif

  1. <?php
  2. $string = preg_replace(&#092;"#[ul](n+)?(.*?)[/ul]#si\",
  3. '<ul><li>'.str_replace( &#092;"n\", '</li><li>', \"2\").'</li></ul>',
  4. $wejscie )
  5. ?>


hm?
id4
Witaj

Niestety - jakoś nie chce mi to zabanglać ... Jako znacznika używam znaku ^, i podstawiając go pod \n nie działa prawidłowo. Działa mi natomiast perfekcyjnie taki kod:
  1. <?php
  2. $string = str_replace(&#092;"<li>rn</li>\", \"\", preg_replace_callback(\"/[ul](.*?)[/ul]/si\", create_function('$func','return \"<ul><li>\".str_replace(\"^\",\"</li><li>\",$func[1]).\"</li></ul>\";'), $string));
  3. ?>


Gdyby dało się skombinować jakiś krótki kod pod to, to byłoby już super smile.gif
Tak czy inaczej wielkie dzięki. Na pewno pomogło mi to sporo.
FiDO
Troszke chyba zbyt zamieszane...
ja proponuje to samo co bendi tylko, ze zamkniete w jedno wywolanie:
  1. <?php
  2.  
  3. '#[ul]s*(.*?)s*[/ul]#si', 
  4. create_function('$m', 'return \"<ul><li>\". preg_replace(\"#(r?n)+#\"\"</li><li>\", $m[1]) .\"</li></ul>\";'), 
  5. $text
  6. );
  7.  
  8. ?>
id4
Witam

Dzięki FiDO - działa zajefajnie ... Próbuję ją jednak przerobić tak, by zamiast na [enter] działała na jakiś znacznik, w moim przypadku na ^ i nie wychodzi mi - dalej mam problem z tym pustym punktem na samym początku.
FiDO
Nie wiem czy dobrze rozumiem... chcesz miec dane wejsciowe w postaci:
Kod
[ul]
jeden^
dwa^
trzy^
[/ul]

itd. ?

Jesli tak to lekka modyfikacja:
  1. <?php
  2.  
  3. '#[ul]s*(.*?)s*[/ul]#si', 
  4. create_function('$m', 'return \"<ul><li>\". str_replace(\"^\"\"</li><li>\", $m[1]) .\"</li></ul>\";'), 
  5. $text
  6. );
  7.  
  8. ?>
id4
Witaj

Dane wejściowe:

Kod
[ul]
^jeden
^dwa
^trzy
[/ul]


Twój przykład wyświetla błąd, ale go poprawiłem na taki kod:
  1. <?php
  2. $string = preg_replace_callback('#[ul]s*(.*?)s*[/ul]#si', create_function('$func', 'return \"<ul><li>\". preg_replace(\"#^+#\"\"</li><li>\", $func[1]) .\"</li></ul>\";'), $string);
  3. ?>


No i właśnie w nim zachodzi taki efekt, że jest jeden wyróżnik na początku posty. Problem rozwiązałoby "olanie" pierwszego znaju ^.

Efekt działąnia jest taki:
Kod
*
* jeden
* dwa
* trzy


Przyznać muszę, że już coraz bliżej do finału smile.gif
FiDO
Skoro Ty tak to ja tak smile.gif

  1. <?php
  2.  
  3.   '#[ul]s*(.*?)s*[/ul]#si', 
  4.   create_function(
  5.     '$m', 
  6.     'return \"<ul>\".preg_replace(\"#^([^^]+)#\"\"<li>$1</li>\", $m[1]).\"</ul>\";'
  7.   ), 
  8.   $text
  9. );
  10.  
  11. ?>
id4
Jesteś wielki
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.