Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] problem z funkcją
Forum PHP.pl > Forum > Przedszkole
MarcinM
Mam problem z przetwarzaniem danych w funcji:

  1. <?php
  2. function TRE($align,$text){
  3.  /*podglad dziala*/
  4.  return '< tresc style="">'.$text.'< /tresc>';
  5. /*nie dziala*/
  6. if($align=='left'){
  7. return '< tresc style="text-align:left">'.$text.'< /tresc>';
  8. }elseif($align=='right'){
  9. return '< tresc style="text-align:right">'.$text.'< /tresc>';
  10. }
  11.  
  12.  
  13. }
  14. $text = ' To jest tresc do <tresc align=right>sformatowania</tresc>'; 
  15.  
  16. echo preg_replace("#<tresc( align=(left|right))>(.*?)</tresc>#si", TRE("1","3"), $text);
  17. ?>


Co może być powodem tego, że nie działa klauzula if ?
Sabistik
  1. <?php
  2. return '< tresc style="">'.$text.'< /tresc>';
  3. ?>

ta oto piekna linijka jest tego powodem winksmiley.jpg Kiedy returnujesz jakas wartosc dalsza czesc funkcji nie jest wykonywana.
mike
Z podstawami programowania zapraszam do manuala: Podręcznik php :: Funkcje :: Zwracane wartości

Przenoszę z php na Przedszkole.
MarcinM
Nie zostałem zrozumiany.

Skreśl linie:
  1. <?php
  2. /*podglad dziala*/
  3.  return '< tresc style="">'.$text.'< /tresc>';
  4. ?>


i przeparsuj kod.

Nic nie zostanie wyswietlone, pytanie dlaczego.
mike
Cytat(MarcinM @ 11.10.2006, 00:15:30 ) *
Nic nie zostanie wyswietlone, pytanie dlaczego.

A dlaczego coś ma się pokazać?
Funkcję poza zdefiniowaniem należy jeszcze wywołać.

Weź sobie do serca radę i przeczytaj rozdział: Podręcznik php :: Opis języka :: Funkcje
MarcinM
Funcja jest wywołana w tej oto linii:

  1. <?php
  2. echo preg_replace("#<tresc( align=(left|right))>(.*?)</tresc>#si", TRE("1","3"), $text);
  3. ?>


Sorka, mały błąd (zapomniałem o \\):

echo preg_replace("#<tresc( align=(left|right))>(.*?)</tresc>#si", TRE("\\1","\\3"), $text);
mike
Ech, no faktycznie.
Popracuj nad wcięciami i czytelnościa kodu

A nie wyswietla się bo żaden z warunków nie jest spełniony.
W instrukcjach warunkowych sprawdzasz wartośc zmiennej $align a podczas wywołania funkcji przekazujesz tam jako "l"

Przecież "l" nie jest równe ani "left", ani "right".


//edit
No teraz to co innego smile.gif
MarcinM
To inaczej:

  1. <?php
  2. function TRE($align,$text){
  3.  
  4.  return $align;
  5.  //to wyswietli sie left lub right
  6.  
  7.  //natomiast w klauzuli nie zostanie wykonane porownanie. Pytanie dlaczego?
  8.  
  9.  /*nie dziala*/
  10.  if($align=='left'){
  11. return '< tresc style="text-align:left">'.$text.'< /tresc>';
  12.  }elseif($align=='right'){
  13. return '< tresc style="text-align:right">'.$text.'< /tresc>';
  14.  }
  15.  
  16.  
  17. }
  18. ?>
MarcinM
Dokladnie wyswietla sie align=left lub align=right, ale nie o to chodzi.

  1. <?php
  2. function TRE($align,$text){
  3.  
  4.  return $align;
  5.  //to wyswietli sie left lub right
  6.  
  7.  //natomiast w klauzuli nie zostanie wykonane porownanie. Pytanie dlaczego?
  8.  
  9.  /*nie dziala*/
  10.  if($align=='align=left'){
  11. return '< tresc style="text-align:left">'.$text.'< /tresc>';
  12.  }elseif($align=='align=right'){
  13. return '< tresc style="text-align:right">'.$text.'< /tresc>';
  14.  }
  15.  
  16.  
  17. }
  18. ?>



Pytanie dlaczego nie jest zwracany kod z klauzuli.
MarcinM
Znikneły posty grzesia (jeżeli dobrze pamietam nick)

questionmark.gif

Ten kod jest poprawny:
  1. <?php
  2. function TRE($align,$text){
  3.  /*podglad dziala*/
  4.  //return $align;
  5.  /*ponizsza klauzula nie dziala*/
  6.  if($align=='align=left'){
  7.  return '< tresc style="text-align:left">'.$text.'< /tresc>';
  8.  }elseif($align=='align=right'){
  9. return '< tresc style="text-align:right">'.$text.'< /tresc>';
  10.  }
  11. }
  12.  
  13. $text = ' To jest tresc do <tresc align=right>sformatowania</tresc>'; 
  14.  
  15. echo preg_replace("#<tresc( align=(left|right))>(.*?)</tresc>#si", TRE("1","3"), $text);
  16. ?>

Moje pytanie brzmi:
Dlaczego nie jest wyswietlany kod z klauzuli.
MarcinM
Zle?

return $align zwraca align=left lub align=right, czyli wszytko Ok

natomiast nie zostaje porownane $align=='align=left' lub $align=='align=left'
Dlaczego?
Pytanie co zrobic, zeby warunek byl spelniony?

PS.
echo nie ma tu zastosowania poniewaz wynik funcji ma byc przetworzony a nie wyswietlony.







Znowu znikneła odpowiedz gszesia aaevil.gif

W nawiązaniu do byłej odpowiedzi gszesia informuje, że nie ma błędu w tej linii:
  1. <?php
  2. echo preg_replace("#<tresc( align=(left|right))>(.*?)</tresc>#si", TRE("1","3"), $text);
  3. ?>


i ponawiam pytanie, dlaczego nie dziala klauzula if questionmark.gif



PS.
Byc moze to specyfika tego forum, ale jak chce dodac nowa odpowiedz to tresc jest wrzucana do mojej ostaniej odpowiedzi (zamiast do nowej)questionmark.gif
gszesiek
znalazłem łatwiejsze rozwiązanie jeśli zależy Ci na czasie smile.gif
ze strony
Kod
<?php
$string = "The quick brown fox jumped over the lazy dog.";

$patterns[0] = "/quick/";
$patterns[1] = "/brown/";
$patterns[2] = "/fox/";

$replacements[2] = "bear";
$replacements[1] = "black";
$replacements[0] = "slow";

echo preg_replace($patterns, $replacements, $string);
?>


(gdzieś pewnie przekombinowałeś, znajdź proszę ten błąd, bo będzie po nocy )

-------------------
a Michal patrzy i nie pomoże :|

-------------------
Cytat
return $align zwraca align=left lub align=right, czyli wszytko Ok

nie do końca, zauważ że nie wypisuje teksu "sformatowany"
MarcinM
Czy ktoś rozumie w czym jest problem?

Proszę wkleić kod i przeparsować.

return zwróci wartość zmiennej $align

ale nie zwróci stringów z klauzuli if().

Dlaczego? Przecież $align posiada wartości (użyte w porównaniu).


PS.
Info dla moderatora. Zauważyłem błąd w kodzie forum. Podczas zapisywania usuwane są podwójne ukośniki \\

W mojej poprzedniej odpowiedzi jest:
echo preg_replace("#<tresc( align=(left|right))>(.*?)</tresc>#si", TRE("\1","\3"), $text);
powinnlo byc:
echo preg_replace("#<tresc( align=(left|right))>(.*?)</tresc>#si", TRE("\\1","\\3"), $text);
mike
Cytat(gszesiek @ 11.10.2006, 01:44:15 ) *
a Michal patrzy i nie pomoże :|

  1. <?php
  2.  
  3. function TRE($matches){
  4.  
  5.  
  6.  if( trim($matches[1])=='align=left' ) {
  7.  
  8.  return '< tresc style="text-align:left">'.$matches[3].'< /tresc>';
  9.  
  10.  } elseif( trim($matches[1])=='align=right' ) {
  11.  
  12.  return '< tresc style="text-align:right">'.$matches[3].'< /tresc>';
  13.  }
  14. }
  15.  
  16. $text = ' To jest tresc do <tresc align=right>sformatowania</tresc>';
  17.  
  18. echo preg_replace_callback("#<tresc( align=(left|right))>(.*?)</tresc>#si", 'TRE', $text);
  19.  
  20. ?>



Cytat(MarcinM @ 11.10.2006, 01:57:45 ) *
Info dla moderatora. Zauważyłem błąd w kodzie forum. Podczas zapisywania usuwane są podwójne ukośniki
Tak, ten błąd jest znany.
Pracujemy nad tym żeby go nie było.

Czas iść spać.
O 07:00 trzeba wstać do pracy :|
MarcinM
Przyznam szczerze, że nie pomyślałem o tablicy.

Ogólnie rzecz ujmując przenoszenie wartości funcji za pomocą argumentów nie do końca działa poprawnie. Byc może w PHP5 nie będzie tego problemu, muszę sprawdzić

Dzięki
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.