Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> wyrażenie regularne + funkcje użytkownika, problemy z cudzysłowiami
rimk
post
Post #1





Grupa: Zarejestrowani
Postów: 31
Pomógł: 0
Dołączył: 2.07.2007

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


Witam. Mam tekst dajmy na to: "AA dfs <FNC>srodtytul("dlatego to wszystko")</FNC> dfsd". Chce zastąpić zawartość znaczników <FNC></FNC> na wartość funkcji, która znajduje się pomiędzy nimi. Wszystko działa dobrze, dopóki nie pojawia się funkcja z atrybutem w cudzysłowiu, czyli dla np "hr()" wszystko jest ok.

Wyrażenie: $body = preg_replace('/<FNC>(.*?)<\/FNC>/e','\\1',$body);
Błąd, który wyskakuje:

Warning: Unexpected character in input: '\' (ASCII=92) state=1 in D:\WWW\trajektoria\index.php(29) : regexp code on line 1

Parse error: syntax error, unexpected $end in D:\WWW\trajektoria\index.php(29) : regexp code on line 1

Fatal error: preg_replace() [function.preg-replace]: Failed evaluating code: srodtytul(\"dlatego to wszystko\") in D:\WWW\trajektoria\index.php on line 29


ps. W oryginalnym tekscie nie ma backslashów.
Go to the top of the page
+Quote Post
flv
post
Post #2





Grupa: Zarejestrowani
Postów: 130
Pomógł: 1
Dołączył: 29.06.2007

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


wczesniej dodaj:
Kod
$body = stripslashes($body);
Go to the top of the page
+Quote Post
Kicok
post
Post #3





Grupa: Zarejestrowani
Postów: 1 033
Pomógł: 125
Dołączył: 17.09.2005
Skąd: Żywiec

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


Wywal flagę e z wyrażenia.
Go to the top of the page
+Quote Post
rimk
post
Post #4





Grupa: Zarejestrowani
Postów: 31
Pomógł: 0
Dołączył: 2.07.2007

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


stripslahes oczywiście nic nie daje.

A kiedy wyrzucę flagę, to w ogóle nie podmienia mi tekstu (wszystko zostaje w znacznikach <FNC>). [a właściwie to dlaczego?? (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) ]

Sprawdźcie u siebie.
Go to the top of the page
+Quote Post
Kicok
post
Post #5





Grupa: Zarejestrowani
Postów: 1 033
Pomógł: 125
Dołączył: 17.09.2005
Skąd: Żywiec

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


Pokaż swój kod, bo to coś u mnie działa bez zarzutu:

  1. <?php
  2.  
  3.  
  4. $body = 'AA dfs <FNC>srodtytul("dlatego to wszystko")</FNC> dfsd';
  5.  
  6.  
  7. $body = preg_replace( '/<FNC>(.*?)</FNC>/', '1', $body );
  8. echo $body;
  9.  
  10. ?>
Go to the top of the page
+Quote Post
rimk
post
Post #6





Grupa: Zarejestrowani
Postów: 31
Pomógł: 0
Dołączył: 2.07.2007

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


No, tak.

Ale spróbuj coś takiego:

  1. <?php
  2.  
  3. function srodtytul($tekst)
  4. {
  5. return $tekst;
  6. }
  7.  
  8.  
  9. $body = 'AA dfs <FNC>srodtytul("dlatego to wszystko")</FNC> dfsd';
  10.  
  11.  
  12. $body = preg_replace( '/<FNC>(.*?)</FNC>/e', '1', $body );
  13. echo $body;
  14.  
  15. ?>


Chodzi o to, żeby pomiędzy znacznikami znalazła się wartość zwracana przez funkcję zadeklarowaną wcześniej.
Go to the top of the page
+Quote Post
Ziels
post
Post #7





Grupa: Zarejestrowani
Postów: 235
Pomógł: 2
Dołączył: 30.06.2006

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


  1. <?php
  2. function srodtytul($tekst)
  3. {
  4. return $tekst;
  5. }
  6. $body = 'AA dfs <FNC>'.srodtytul("dlatego to wszystko").'</FNC> dfsd';
  7. $body = preg_replace( '/<FNC>(.*?)</FNC>/si', '1', $body );
  8. echo $body;
  9. ?>


O to chodzi?
Go to the top of the page
+Quote Post
rimk
post
Post #8





Grupa: Zarejestrowani
Postów: 31
Pomógł: 0
Dołączył: 2.07.2007

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


Nie, $body pobieram z bazy danych. Nie mogę tak zrobić.

ps. A i tak: Warning: preg_replace() [function.preg-replace]: Unknown modifier 'F' in D:\WWW\tmp\index.php on line 7
Go to the top of the page
+Quote Post
Kicok
post
Post #9





Grupa: Zarejestrowani
Postów: 1 033
Pomógł: 125
Dołączył: 17.09.2005
Skąd: Żywiec

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


Da się to rozwiązać używając funkcję preg_replace_callback" title="Zobacz w manualu PHP" target="_manual:

  1. <?php
  2.  
  3.  
  4. function srodtytul( $text )
  5. {
  6. return "<b>{$text}</b>";
  7. }
  8.  
  9. function cosInnego( $text )
  10. {
  11. return "<u>{$text}</u>";
  12. }
  13.  
  14.  
  15.  
  16. function callbackFunction( $matches )
  17. {
  18. eval( "$text = {$matches[1]};" );
  19. return $text;
  20. }
  21.  
  22. $body = 'AA dfs <FNC>srodtytul("dlatego to wszystko")</FNC> df<br />
  23.  sd afsf as <FNC>cosInnego("podkreślony tekst")</FNC>s asf ';
  24.  
  25. $body = preg_replace_callback( '/<FNC>(.*?)</FNC>/i', 'callbackFunction', $body );
  26. echo $body;
  27.  
  28. ?>



Mam nadzieję, że zdajesz sobie sprawę z tego, że takie rozwiązanie naraża cię na wielkie niebezpieczeństwo (szczególnie, jeśli wszyscy użytkownicy będą mogli używać tagów <FNC></FNC>)
Go to the top of the page
+Quote Post
rimk
post
Post #10





Grupa: Zarejestrowani
Postów: 31
Pomógł: 0
Dołączył: 2.07.2007

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


Właśnie chciałem uniknąć evala. Stąd te wyrażenia reg.

Ktoś może wie, czemu nie przechodzi w preg_replace cudzysłów z funkcji?
Go to the top of the page
+Quote Post
Kicok
post
Post #11





Grupa: Zarejestrowani
Postów: 1 033
Pomógł: 125
Dołączył: 17.09.2005
Skąd: Żywiec

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


Zwykłe preg replace z flagą e też robi coś w rodzaju evala:

  1. <?php
  2.  
  3. $i = 1;
  4.  
  5. $str = 'aaa bb aaa ccc';
  6. $str = preg_replace( '/a/e', 'print "Znalazłem literę "a" numer " . $i++ . "<br />"', $str );
  7.  
  8.  
  9. ?>

(Co ciekawe zamiana print na echo powoduje wyrzucenie błedu :|)



Cytat
Ktoś może wie, czemu nie przechodzi w preg_replace cudzysłów z funkcji?

Przed znakami cudzysłowia w znalezionym tekście pojawiły się backshashe, które zakłócały pracę preg_replace'owego evala. Kolejna dziwna rzecz :|

Ten post edytował Kicok 4.07.2007, 17:44:55
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: 15.09.2025 - 17:49