Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Zamiana podciągów w tekscie ale..
Forum PHP.pl > Forum > PHP
LubieWino
Mam takie chyba dość proste pytanko. zamiana ciągów znaków odbywa się przez:

str_replace ('wyraz_do_zmiany', 'wyraz_zmieniony', 'cały_text'),

czy możecie mi napisać wyrażenie które zamienia wyrazy zawierający jakiś podciąg na jakiś określony wyraz? czyli np:

chciałbym zamienić każdy z wyrazów , który zawiera w sobie podciąg 'oza', na wyraz 'domek'.

jakie powinienem wpisać wyrażenie do funkcji str_replace w pierwszej rubryce?
b_chmura
co to są podciągi? :D
ayeo
  1. <?php
  2. $pattern = "#S*ozaS*#"; // pasuje do każdego wyrazu zawierajacego "oza"
  3. $text = "mala koza w kropki bordo nazywa się Soza z filmu Scareface Loozaaa Booooza!!"; // przykladowy tekst
  4. $new_text = preg_replace($pattern, "domek", $text); 
  5.  
  6. echo $text."<br />".$new_text;
  7. ?>
LubieWino
ok super dzięki !

ALE ! jest jeszcze mały problem. nie chce zeby funkcja uwzględniała wielkości liter.

a narazie jest tak, że jak napisze w texcie 'koza nazywa sie ZOZA'.
to mi tylko zamienia podciag 'oza' w wyrazie 'koza', natomiast wyraz 'ZOZA' pozostaje niezmieniony.

można to jakoś rozwiązać?
b_chmura
  1. <?php
  2. $pattern = "#S*(oza)|(OZA)S*#";
  3. ?>
LubieWino
O dżizys.... panowie, skupiłem sie na wilkościach liter.. a przecież w ogóle .. od początku nie tak !

NIE chodzi mi o to, że jeśli mam wyraz 'ZOZOL' to funkcja wynajduje mi podciąg 'OZO' i zamienia ten podciąg na 'domek', tak że w ostateczności jest: 'ZdomekL'
chce aby funkcja zamieniała CAŁY wyraz, a nie tylko podciąg w wyrazie, czyli w tym przypadku efekt ostateczny powinien być po prostu 'domek' ! bez początkowej litery 'Z' i końcowej 'L' .

poóżcie prosze
b_chmura
hmmm a to jak na moją głowę już większa sztuka

pierwsze co mi przyszło na myśl to każde słowo przypisać do tablicy, sprawdzać czy występuje w nim w/w ciąg znaków
jeśli tak zamienić je na "domek"
marcio
Chodzi o to:
  1. <?php
  2. $ciag = 'bla bla bla';
  3.  $nowy_ciag = str_replace('bla', 'Domek', $ciag);
  4.  echo($ciag.'|'.$nowy_ciag);
  5. ?>


0ps sorki chyba zle zrozumialem myslalem ze to chcialo
Cytat
chce aby funkcja zamieniała CAŁY wyraz, a nie tylko podciąg w wyrazie, czyli w tym przypadku efekt ostateczny powinien być po prostu 'domek' ! bez początkowej litery 'Z' i końcowej 'L' .

powiedziec ze dany wyraz chce zastapic na inny
LubieWino
nie marcio, to jest dokladnie to samo co poprzedni kod.

jak dasz $ciąg = 'bla blada grobla';

to efekt końcowy będzie 'domek domekda grodomek';

a chce w tym wypadku efekt 'domek domek domek'
marcio
no i wlasnie taki efekt jest biggrin.gif

P.S czekaj znowu zle przeczytalem chodzi ci o to ze obojetnie co bedzie w ciag to kazdy jego wyraz ma zmienic na domek?
b_chmura
EDYTOWANE
zamienione na funkcje i testowane

  1. <?php
  2. function zmien($co, $naco, $wczym)
  3. {
  4. $wyrazy = explode(' ', $wczym);
  5.  
  6. foreach($wyrazy as $wyraz)
  7. {
  8. if(eregi($co, $wyraz))
  9. {
  10. $out .= $naco.' ';
  11. }
  12. else
  13. {
  14. $out .= $wyraz.' ';
  15. }
  16. }
  17. return $out;
  18. }
  19.  
  20. $zmieniona_tresc = zmien('bla', 'Domek', 'bla blada grobla');
  21.  
  22. echo $zmieniona_tresc;
  23. ?>
ayeo
kod, który Ci podałem w poprzdnim poście działa tak jak chcesz! Jedyne co musisz dodać to :

$text = strtolower($text);
b_chmura
Cytat(marcio @ 9.12.2007, 22:17:38 ) *
no i wlasnie taki efekt jest biggrin.gif

P.S czekaj znowu zle przeczytalem chodzi ci o to ze obojetnie co bedzie w ciag to kazdy jego wyraz ma zmienic na domek?



Cytat(ayeo @ 9.12.2007, 22:32:05 ) *
kod, który Ci podałem w poprzdnim poście działa tak jak chcesz! Jedyne co musisz dodać to :

$text = strtolower($text);


Zanim zaczniecie odpowiadać przeczytajcie w czym tkwi problem, nie rozumiem waszego działania...

~LubieWino funkcja którą Ci podałem spełnia sie w 100% jednak istnieje może jakieś inne optymalniejsze rozwiązanie, nie wiem, musisz poczekać aż jakiś specjalista sie odezwie
LubieWino
ayeo - główna sprawa jest taka, że ten kod nie działa jak powinien, bo on nie zamienia mi całych wyrazów a jedynie podciąg wyrazów. odnasząc się do twojego przykładu, efekt końcowy zdania które podałeś jest:

'mala kdomek w kropki bordo nazywa się Sdomek z filmu Scareface Lodomekaa Booodomek!!"

a ma być:

'mala domek w kropki bordo nazywa się domek z filmu Scareface domek domek!!"

chmura.... huh ... zadziałeś teraz... musze chwile to przetestować i napisze co i jak
ayeo
Pierwszy kod właśnie tak działa!! Jeżeli zmieniłeś później $pattern; to już nie moja wina! Sprawdź to proszę!
@b_chmura to chyba Ty podałeś zły $pattern tongue.gif Co do kodu, który podałeś potem to wydaje się być spoko.

Pozdrawiam!

EDIT Forum usunęło backslashe sprzed "S" w $pattern smile.gif dlatego może nie działało smile.gif
LubieWino
hehe , ok działa:)

podejrzwałem że coś nie tak z tym zapytaniem, ale jeszcze sie z tym nie obeznałem dokładnie. dobrze ze udalo ci sie to znaleźć.

tak czy siak dzieki tobie i dzieki wszystkim !
b_chmura
~ayeo zwracam honor, faktycznie po dodaniu backslashy działa jak należy

Pozdrawiam
Chmura

PS: a to głupie forum :P :D

---
Ja Ci dam glupie :P :D /~strife/
LubieWino
ale czy na pewno te backslashe usunęło forum? czy to nieuwaga ayeo?
a może specjalnie to zrobił zebyśmy mieli horror (przynajmniej ja) ;>
ayeo
forum, bo z kodu b_chmura też usunęło tongue.gif chociaż na początku chyba jeszcze były...
franki01
Najprostsza rzecz a ludzie sie mecza biggrin.gif

  1. <?php
  2. $tekst = 'abccostam lolcosstamsabc costamlolabc';
  3. $cozamienic = 'costam';
  4. $naco = 'domek';
  5.  
  6. $litery = 'ęóąśłżźćńĘÓĄŚŁŻŹĆŃa-zA-Z';
  7. $tekst = ' '.$tekst.' ';
  8. $tekst = preg_replace("(([^{$litery}])(?:[{$litery}]*?)".preg_quote($cozamienic)."(?:[{$litery}]*?)([^{$litery}]))is", '$1'.$naco.'$2', $tekst);
  9. $tekst = preg_replace("(([^{$litery}])(?:[{$litery}]*?)".preg_quote($cozamienic)."(?:[{$litery}]*?)([^{$litery}]))is", '$1'.$naco.'$2', $tekst);
  10. $tekst = substr($tekst, 1, -1);
  11. ?>


Sprawdzone i dziala. Dwa razy jest to samo preg_match, bo jak wyrazy sa kolo siebie to zamienia co drugi.
b_chmura
z tego co zauważyłem rozwiązanie ayeo spełnia się. Więc po co to dziwne coś u góry:D
franki01
A dlaczego dziwne? biggrin.gif Tamto rozwiazanie nie wiem czy dziala bo nie sprawdzalem. Opieralem sie na tym ze ktos pisal ze nie dziala. Rozwiazaniu @ayeo brakuje chyba modifikatora i, ktory nie bedzie zwracal uwagi na wielkosc liter.
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.