Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Dla wyjadaczy Wyrażeń Regularnych, Pomoc przy liście wyliczeń
id4
post
Post #1





Grupa: Zarejestrowani
Postów: 223
Pomógł: 1
Dołączył: --
Skąd: Rogożnik /K-ce/

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 10)
bendi
post
Post #2





Grupa: Zarejestrowani
Postów: 401
Pomógł: 5
Dołączył: 14.09.2003
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


  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. ?>
Go to the top of the page
+Quote Post
id4
post
Post #3





Grupa: Zarejestrowani
Postów: 223
Pomógł: 1
Dołączył: --
Skąd: Rogożnik /K-ce/

Ostrzeżenie: (0%)
-----


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

Ten post edytował id4 21.06.2005, 11:50:11
Go to the top of the page
+Quote Post
hwao
post
Post #4


Developer


Grupa: Moderatorzy
Postów: 2 844
Pomógł: 20
Dołączył: 25.11.2003
Skąd: Olkusz




a szybciej bedzie tak (IMG:http://forum.php.pl/style_emoticons/default/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?
Go to the top of the page
+Quote Post
id4
post
Post #5





Grupa: Zarejestrowani
Postów: 223
Pomógł: 1
Dołączył: --
Skąd: Rogożnik /K-ce/

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Tak czy inaczej wielkie dzięki. Na pewno pomogło mi to sporo.
Go to the top of the page
+Quote Post
FiDO
post
Post #6





Grupa: Przyjaciele php.pl
Postów: 1 717
Pomógł: 0
Dołączył: 12.06.2002
Skąd: Wolsztyn..... Studia: Zielona Góra

Ostrzeżenie: (0%)
-----


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. ?>
Go to the top of the page
+Quote Post
id4
post
Post #7





Grupa: Zarejestrowani
Postów: 223
Pomógł: 1
Dołączył: --
Skąd: Rogożnik /K-ce/

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
FiDO
post
Post #8





Grupa: Przyjaciele php.pl
Postów: 1 717
Pomógł: 0
Dołączył: 12.06.2002
Skąd: Wolsztyn..... Studia: Zielona Góra

Ostrzeżenie: (0%)
-----


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. ?>
Go to the top of the page
+Quote Post
id4
post
Post #9





Grupa: Zarejestrowani
Postów: 223
Pomógł: 1
Dołączył: --
Skąd: Rogożnik /K-ce/

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
FiDO
post
Post #10





Grupa: Przyjaciele php.pl
Postów: 1 717
Pomógł: 0
Dołączył: 12.06.2002
Skąd: Wolsztyn..... Studia: Zielona Góra

Ostrzeżenie: (0%)
-----


Skoro Ty tak to ja tak (IMG:http://forum.php.pl/style_emoticons/default/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. ?>
Go to the top of the page
+Quote Post
id4
post
Post #11





Grupa: Zarejestrowani
Postów: 223
Pomógł: 1
Dołączył: --
Skąd: Rogożnik /K-ce/

Ostrzeżenie: (0%)
-----


Jesteś wielki
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 12:45