Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][RegExp] Problem :]
Spirit86
post
Post #1





Grupa: Zarejestrowani
Postów: 607
Pomógł: 23
Dołączył: 8.09.2004
Skąd: Wrocław

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


Witam.
Piszę właśnie funkcję, która ma ukrywać kod. Problem wygląda tak:
Kod
(RE)
użytkownik JAKIŚNICK ( 2004-10-03 19:23:54 ) napisał:
jakiś tekst aasgasdf
(/RE)

chcę zamienić to na takie coś:
  1. <b>użytkownik JAKIŚNICK ( 2004-10-03 19:23:54 ) napisał:</b><br /><div id=ID>jakiś tekst aasgasdf</div>

gdzie ID to data (2004-10-03 19:23:54) pozbawiona ( '-',' ',':' ) - czyli: 20041003192354
napisałem
  1. <?php
  2. function hideRE($text)
  3. {
  4.   global $lang;
  5.   $RegExpr = str_replace(array('{username}', '{date}'), array('(A-Za-z0-9)', '(0-9-:)'), $lang['RE_Line']); //wyrażenie regularne oddzielające nick i datę
  6.   $text = preg_replace("#(RE)(.*?)(/RE)#si","<div style="font-color: silver;">1</div>", $text);
  7.  
  8.   return $text;        
  9. }
  10. ?>

tylko utkwiłem w martwym punkcie ;(

Ten post edytował Spirit86 30.09.2005, 22:15:54


--------------------
Audio: Metallica, Soil, RHCP, OffSpring, Green Day, "Retro", Gorillaz, Disturbed, Coma
DB: MySQL 4.1 | php: 4.4.3 Pomogłem Ci? Wciśnij przycisk POMÓGŁ.
Go to the top of the page
+Quote Post
s_w_ir
post
Post #2





Grupa: Zarejestrowani
Postów: 315
Pomógł: 1
Dołączył: 6.08.2003
Skąd: Kielce

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


  1. <?php
  2. function hideRE($text)
  3. {
  4. global $lang;
  5. $RegExpr = str_replace(array('{username}', '{date}'), array('(A-Za-z0-9)', '(0-9-:)'), $lang['RE_Line']); //wyrażenie regularne oddzielające nick i datę
  6. $text = preg_replace("#(RE)(.*?)(napisał:)(.*?)(/RE)#si","<b>12</b><div style="font-color: silver;">3</div>", $text);
  7.  
  8. return $text;
  9. }
  10. $a = "(RE)
  11. użytkownik JAKIŚNICK ( 2004-10-03 19:23:54 ) napisał:
  12. jakiś tekst aasgasdf
  13. (/RE)";
  14.  
  15. echo hideRE($a);
  16. ?>

Nie wiem czy to to o co Ci chodzi, ale jeśli nie to wklej jeszcze raz to co chcesz uzyskać, bo tamten post jest jakis zepsuty. Pozdro.
Go to the top of the page
+Quote Post
Spirit86
post
Post #3





Grupa: Zarejestrowani
Postów: 607
Pomógł: 23
Dołączył: 8.09.2004
Skąd: Wrocław

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


no teraz jest prawie dobrze, ale znalazłem następujące bugi:

1) Gdy jest (RE) "zagnieżdżone" (czyli (RE) assdf (RE)adsasd(/RE)(/RE) tekst się niszczy.
2) Nie ma w divie tego ważnego, jak dla mnie, ID smile.gif

Edytowałem mój powyższy post.
Pozdrawiam


--------------------
Audio: Metallica, Soil, RHCP, OffSpring, Green Day, "Retro", Gorillaz, Disturbed, Coma
DB: MySQL 4.1 | php: 4.4.3 Pomogłem Ci? Wciśnij przycisk POMÓGŁ.
Go to the top of the page
+Quote Post
s_w_ir
post
Post #4





Grupa: Zarejestrowani
Postów: 315
Pomógł: 1
Dołączył: 6.08.2003
Skąd: Kielce

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


  1. <?php
  2. function hideRE($text)
  3. {
  4.   
  5.   $text = preg_replace("#(RE)(.*?)(d+)-(d+)-(d+) (d+):(d+):(d+)( ) napisał:)(.*?)(/RE)#si","<b>12-3-4 5:6:78</b><br /><div id=234567>9</div>", $text);
  6.  
  7.   return $text;
  8. }
  9. ?>
To działa na bank (u mnie było OK) dla zwykłych wpisów(Pasuje to dokładnie pod schemat który pokazałeś w pierwszym poście). Jakkolwiek bardzo mi sie nie podoba to co stworzyłem(wygląda bardzo nieoptymalnie), dziś dopiero zrozumiałem jak działa preg_replace(), dlatego też odpisałem na Twój post. Jutro zgłębie bardziej wiedze na temat bardziej zaawansowanego użycia tej funkcji.
Co do zagnieżdżonych to jeszcze nie wiem, miałem koncepcje, ale dawało to nieoczekiwane efekty sad.gif
Pozdrawiam.

edit***
Wywaliłem początek Twojej funkcji bo uznałem ten fragment za nieprzydatny kiedy będzie potrzeba robić zagnieżdżenie.

Ten post edytował s_w_ir 1.10.2005, 01:41:42
Go to the top of the page
+Quote Post
Spirit86
post
Post #5





Grupa: Zarejestrowani
Postów: 607
Pomógł: 23
Dołączył: 8.09.2004
Skąd: Wrocław

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


@s_w_ir: To drugie rozwiązanie nie jest dobre, bo sprawa wygląda tak:

wszystko zależy od języka jaki się wybierze.
tzn. jest zmienna $lang = array(); //standart.

Teraz, tak,


  1. <?php
  2. $lang['RE_Line'] = '(RE)użytkownik {username} ( {date} ) napisał:'; 
  3. ?>


i po przejściach wygląda tak: ):
Kod
(RE)
użytkownik JAKIŚNICK ( 2004-10-03 19:23:54 ) napisał:
jakiś tekst aasgasdf
(/RE)


1) porównujemy (RE) (.?*) (/RE) ze zmienną $lang['REline'], wyciągamy ten string z tekstu, liczymy ID.
2) Rozdzielamy (RE) JAKIŚ TEKST (/RE) (Zamiast tego wstawimy:
  1. <b>użytkownik JAKIŚNICK ( 2004-10-03 19:23:54 ) napisał:</b><br /><div id=ID>jakiś tekst aasgasdf</div>

chcę uzyskać efekt:

[wiersz]Użytkownik NazwaUsera ( 2004-10-03 19:23:54 ) napisał:[/wiersz]
[wiersz schowany] TREŚĆ [/wiersz]

W JS napisałem funkcję:
  1. <script type="text/javascript">
  2. <!--
  3. function menu(id_one)
  4. {
  5. if(document.getElementById(id_one).style.display == 'inline')
  6. document.getElementById(id_one).style.display = 'none';
  7. else
  8. document.getElementById(id_one).style.display = 'inline';
  9. }
  10. -->
  11. </script>

Stosuje się ją odwołując się do UNIKALNEGO ID, no i w tym problem.

Zastanawiałem się, czy nie da się prościej (bez tego ID), ale nie przychodzi mi nic do głowy, może użyć this.?
Pozdrawiam


--------------------
Audio: Metallica, Soil, RHCP, OffSpring, Green Day, "Retro", Gorillaz, Disturbed, Coma
DB: MySQL 4.1 | php: 4.4.3 Pomogłem Ci? Wciśnij przycisk POMÓGŁ.
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 20.08.2025 - 06:16