Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] pętla zmieniająca tekst na inny w stringu dla każdego wiersza
Forum PHP.pl > Forum > Przedszkole
thepanone
Chciałbym napisać program, który zrobi rzecz następującą:
1. pobierze zawartość pliku tekstowego i każdy kolejny wiersz zapisze w każdym kolejnym elemencie tablicy stringów
2. dla każdego kolejnego elementu tablicy sprawdzi czy w stringu występuje zadany fragment tekstu
2a. jeśli występuje to zamieni inny fragment tekstu w tym stringu na podany
2b. jeśli nie występuje to idzie dalej


Powiedzmy, że pkt 1 jest już wykonany i mam w tablicy zawartość pliku
załóżmy, że mam tablicę stringów pięcioelementową $tablica

wykorzystuję funkcje:
preg_match - do sprawdzenia czy w wierszu występuje fragment tekstu
preg_replace - do zamiany fragmentu tekstu na inny w tym stringu
  1. for ( i = 0, i < 5, i ++ )
  2. {
  3. if (preg_match("abc", $tablica[i])) //jeśli występuje w wierszu fragment "abc"
  4. {
  5. $tablica[i]= preg_replace(111, 555, $tablica[i]);//to zastąp w tym wierszu fragment 111 na 555
  6. }
  7. else
  8. {
  9. if (preg_match("def", $tablica[i])) //jeśli występuje w wierszu fragment "def"
  10. {
  11. $tablica[i]= preg_replace(111, 666, $tablica[i]);//to zastąp w tym wierszu fragment 111 na 666
  12. }
  13. else
  14. {
  15. if (preg_match("ghi", $tablica[i])) //jeśli występuje w wierszu fragment "ghi"
  16. {
  17. $tablica[i]= preg_replace(111, 777, $tablica[i]);//to zastąp w tym wierszu fragment 111 na 777
  18. }
  19. }
  20. }
  21. }
  22.  


proszę pomóc mi ten kod uczłowieczyć. W zasadzie wiem co mam użyć, ale jak to poskładać w kupę to już niestety nie.
mar1aczi
Bardziej:
  1. for ( i = 0, i < 5, i ++ )
  2. {
  3. if (preg_match("abc", $tablica[i])) //jeśli występuje w wierszu fragment "abc"
  4. {
  5. $tablica[i]= preg_replace(111, 555, $tablica[i]);//to zastąp w tym wierszu fragment 111 na 555
  6. }
  7. elseif (preg_match("def", $tablica[i])) //jeśli występuje w wierszu fragment "def"
  8. {
  9. $tablica[i]= preg_replace(111, 666, $tablica[i]);//to zastąp w tym wierszu fragment 111 na 666
  10. }
  11. elseif (preg_match("ghi", $tablica[i])) //jeśli występuje w wierszu fragment "ghi"
  12. {
  13. $tablica[i]= preg_replace(111, 777, $tablica[i]);//to zastąp w tym wierszu fragment 111 na 777
  14. }
  15. }
thepanone
Po odpaleniu skryptu z plikiem tekstowym nie dzieje się nic. Proszę o wskazówkę.
  1. <?php
  2. $tablicapliku = file("plik.txt");//wczytanie całego pliku w tablicę. Każdy wiersz jako osobny element tablicy. plik ma 15 wierszy
  3. $a = "/aaa/";
  4. $b = "/bbb/";
  5. $c = "/ccc/";
  6. $d = "/ddd/";
  7. $e = "/eee/";
  8. $zero = "/000/";
  9. $jeden = "/111/";
  10. $dwa = "/222/";
  11. $trzy = "/333/";
  12. $cztery = "/444/";
  13. $piec = "/555/";
  14.  
  15. for ( $i = 0; $i < 15; $i ++ )
  16. {
  17. if (preg_match($a, $tablicapliku[$i])) //jeśli występuje w wierszu fragment "abc"
  18. {
  19. $tablicapliku[$i]= preg_replace( $zero, $jeden , $tablicapliku[$i]);//to zastąp w tym wierszu fragment 000 na 111
  20. }
  21. elseif (preg_match($b, $tablicapliku[$i])) //jeśli występuje w wierszu fragment "/bbb/"
  22. {
  23. $tablicapliku[$i]= preg_replace($zero, $dwa, $tablicapliku[$i]);//to zastąp w tym wierszu fragment 000 na 222
  24. }
  25. elseif (preg_match($c, $tablicapliku[$i])) //jeśli występuje w wierszu fragment "/ccc/"
  26. {
  27. $tablicapliku[$i]= preg_replace($zero , $trzy, $tablicapliku[$i]);//to zastąp w tym wierszu fragment 000 na 333
  28. }
  29. elseif (preg_match($d, $tablicapliku[$i])) //jeśli występuje w wierszu fragment "/ddd/"
  30. {
  31. $tablicapliku[$i]= preg_replace($zero, $cztery, $tablicapliku[$i]);//to zastąp w tym wierszu fragment 000 na 444
  32. }
  33. elseif (preg_match($e, $tablicapliku[$i])) //jeśli występuje w wierszu fragment "eee"
  34. {
  35. $tablicapliku[$i]= preg_replace($zero, $piec, $tablicapliku[$i]);//to zastąp w tym wierszu fragment 000 na 555
  36. }
  37. }
  38. ?>

plik.txt

aaa xxxxxxxxxxxxxxxxxxxx 000
bbb xxxxxxxxxxxxxxxxxxxx 000
ccc xxxxxxxxxxxxxxxxxxxx 000
ddd xxxxxxxxxxxxxxxxxxxx 000
eee xxxxxxxxxxxxxxxxxxxx 000
fff xxxxxxxxxxxxxxxxxxxx 000
aaa xxxxxxxxxxxxxxxxxxxx 000
bbb xxxxxxxxxxxxxxxxxxxx 000
ccc xxxxxxxxxxxxxxxxxxxx 000
ddd xxxxxxxxxxxxxxxxxxxx 000
eee xxxxxxxxxxxxxxxxxxxx 000
fff xxxxxxxxxxxxxxxxxxxx 000
aaa xxxxxxxxxxxxxxxxxxxx 000
bbb xxxxxxxxxxxxxxxxxxxx 000
ccc xxxxxxxxxxxxxxxxxxxx 000
ddd xxxxxxxxxxxxxxxxxxxx 000
eee xxxxxxxxxxxxxxxxxxxx 000
fff xxxxxxxxxxxxxxxxxxxx 000




edit: nie wiedziałem, że kliknięcie podziękowania oznacza załatwienie problemu w temacie. Musze założyć nowy temat bo nikt tu już nie zaglądnie. W razie co to proszę o usunięcie jednego z tematów
Kshyhoo
Cytat(thepanone @ 1.01.2014, 20:35:54 ) *
edit: nie wiedziałem, że kliknięcie podziękowania oznacza załatwienie problemu w temacie. Musze założyć nowy temat bo nikt tu już nie zaglądnie. W razie co to proszę o usunięcie jednego z tematów

Człowieku, 1 stycznia wymagasz, żeby ludzie na rzęsach pomagali w pisaniu skryptów? Daj ludziom odpocząć i sam wykaż się inicjatywą...
thepanone
a czy je domofonem dzwonie po ludziach? Nie zgłaszam zastrzeżeń, że nikt mi nie odpisuje w po 2 minutach, tłumaczę się dlaczego zakładam nowy temat.

Nikt tu nie wejdzie bo temat jest oznaczony jako załatwiony (żółty).
com
No chyba nie, bo nie takie zasady panują na tym forum, a jak już sam nie potrafisz rozwiązać tego błędu to pytasz o to google ono zna odpowiedź, a jak nie zna to przychodzisz do nas a nie na odwrót wink.gif
Kshyhoo
Liczysz, że ktoś zrobi wszystko za Ciebie? Dlaczego to piszę?
Cytat(thepanone @ 1.01.2014, 20:35:54 ) *
Po odpaleniu skryptu z plik2.php przeglądarka zgłasza dwa błedy:
1. Warning: Unknown: failed to open stream: No such file or directory in Unknown on line 0
2. Fatal error: Unknown: Failed opening required 'C:/wamp/www/folder/plik2.php' (include_path='.;C:\php\pear') in Unknown on line 0

1. Użyj translatora Google, żeby przetłumaczyć treść komunikatu a dowiesz się, dlaczego masz ten błąd. Jeżeli nie znasz podstaw angielskiego, to musisz to nadrobić, bo nazwy funkcji są po angielsku.
2. Sprawdź wpierw, co zwraca pobranie danych z pliku, np. tak:
  1. var_dump($tablicapliku[$i]);


Wyciągnij wnioski, popraw kod i wróć, jeżeli będziesz potrzebował pomocy, ale z prawdziwymi problemami.
thepanone
składnia poprawiona. Skrypt nie modyfikuje mi pliku tekstowego. Proszę o wskazówkę.
  1. <?php
  2. $tablicapliku = file("plik.txt");//wczytanie całego pliku w tablicę. Każdy wiersz jako osobny element tablicy. plik ma 15 wierszy
  3. $a = "/aaa/";
  4. $b = "/bbb/";
  5. $c = "/ccc/";
  6. $d = "/ddd/";
  7. $e = "/eee/";
  8. $zero = "/000/";
  9. $jeden = "/111/";
  10. $dwa = "/222/";
  11. $trzy = "/333/";
  12. $cztery = "/444/";
  13. $piec = "/555/";
  14.  
  15. for ( $i = 0; $i < 15; $i ++ )
  16. {
  17. if (preg_match($a, $tablicapliku[$i])) //jeśli występuje w wierszu fragment "abc"
  18. {
  19. $tablicapliku[$i]= preg_replace( $zero, $jeden , $tablicapliku[$i]);//to zastąp w tym wierszu fragment 000 na 111
  20. }
  21. elseif (preg_match($b, $tablicapliku[$i])) //jeśli występuje w wierszu fragment "/bbb/"
  22. {
  23. $tablicapliku[$i]= preg_replace($zero, $dwa, $tablicapliku[$i]);//to zastąp w tym wierszu fragment 000 na 222
  24. }
  25. elseif (preg_match($c, $tablicapliku[$i])) //jeśli występuje w wierszu fragment "/ccc/"
  26. {
  27. $tablicapliku[$i]= preg_replace($zero , $trzy, $tablicapliku[$i]);//to zastąp w tym wierszu fragment 000 na 333
  28. }
  29. elseif (preg_match($d, $tablicapliku[$i])) //jeśli występuje w wierszu fragment "/ddd/"
  30. {
  31. $tablicapliku[$i]= preg_replace($zero, $cztery, $tablicapliku[$i]);//to zastąp w tym wierszu fragment 000 na 444
  32. }
  33. elseif (preg_match($e, $tablicapliku[$i])) //jeśli występuje w wierszu fragment "eee"
  34. {
  35. $tablicapliku[$i]= preg_replace($zero, $piec, $tablicapliku[$i]);//to zastąp w tym wierszu fragment 000 na 555
  36. }
  37. }
  38. ?>


plik.txt

aaa xxxxxxxxxxxxxxxxxxxx 000
bbb xxxxxxxxxxxxxxxxxxxx 000
ccc xxxxxxxxxxxxxxxxxxxx 000
ddd xxxxxxxxxxxxxxxxxxxx 000
eee xxxxxxxxxxxxxxxxxxxx 000
fff xxxxxxxxxxxxxxxxxxxx 000
aaa xxxxxxxxxxxxxxxxxxxx 000
bbb xxxxxxxxxxxxxxxxxxxx 000
ccc xxxxxxxxxxxxxxxxxxxx 000
ddd xxxxxxxxxxxxxxxxxxxx 000
eee xxxxxxxxxxxxxxxxxxxx 000
fff xxxxxxxxxxxxxxxxxxxx 000
aaa xxxxxxxxxxxxxxxxxxxx 000
bbb xxxxxxxxxxxxxxxxxxxx 000
ccc xxxxxxxxxxxxxxxxxxxx 000
ddd xxxxxxxxxxxxxxxxxxxx 000
eee xxxxxxxxxxxxxxxxxxxx 000
fff xxxxxxxxxxxxxxxxxxxx 000
com
wszytko pięknie tylko gdzie zapisujesz do tego pliku?
thepanone
ekstra, wreszcie prawie to działa. jest jeszcze jeden problem

dodałem ostatnich 5 linijek kodu, skrypt wygląda tak :
  1. <?php
  2. $tablicapliku = file("plik.txt");//wczytanie całego pliku w tablicę. Każdy wiersz jako osobny element tablicy. plik ma 15 wierszy
  3.  
  4. $a = "/aaa/";
  5. $b = "/bbb/";
  6. $c = "/ccc/";
  7. $d = "/ddd/";
  8. $e = "/eee/";
  9. $zero = "/000/";
  10. $jeden = "/111/";
  11. $dwa = "/222/";
  12. $trzy = "/333/";
  13. $cztery = "/444/";
  14. $piec = "/555/";
  15.  
  16. for ( $i = 0; $i < 15; $i ++ )
  17. {
  18. if (preg_match($a, $tablicapliku[$i])) //jeśli występuje w wierszu fragment "aaa"
  19. {
  20. $tablicapliku[$i]= preg_replace( $zero, $jeden , $tablicapliku[$i]);//to zastąp w tym wierszu fragment 000 na 111
  21.  
  22. }
  23. elseif (preg_match($b, $tablicapliku[$i])) //jeśli występuje w wierszu fragment "/bbb/"
  24. {
  25. $tablicapliku[$i]= preg_replace($zero, $dwa, $tablicapliku[$i]);//to zastąp w tym wierszu fragment 000 na 222
  26. }
  27. elseif (preg_match($c, $tablicapliku[$i])) //jeśli występuje w wierszu fragment "/ccc/"
  28. {
  29. $tablicapliku[$i]= preg_replace($zero , $trzy, $tablicapliku[$i]);//to zastąp w tym wierszu fragment 000 na 333
  30. }
  31. elseif (preg_match($d, $tablicapliku[$i])) //jeśli występuje w wierszu fragment "/ddd/"
  32. {
  33. $tablicapliku[$i]= preg_replace($zero, $cztery, $tablicapliku[$i]);//to zastąp w tym wierszu fragment 000 na 444
  34. }
  35. elseif (preg_match($e, $tablicapliku[$i])) //jeśli występuje w wierszu fragment "eee"
  36. {
  37. $tablicapliku[$i]= preg_replace($zero, $piec, $tablicapliku[$i]);//to zastąp w tym wierszu fragment 000 na 555
  38. }
  39. }
  40. //zamiana tablicy w string
  41. $string = implode($tablicapliku);
  42. //zapisanie nowej tablicy i zamkniecie pliku
  43. $ciagzapisu = $string;
  44. $usun = fopen("plik.txt",'wb');
  45. fwrite($usun, $ciagzapisu);
  46. fclose($usun);
  47. ?>


natomiast rezultat jest taki:

aaa xxxxxxxxxxxxxxxxxxxx /111/
bbb xxxxxxxxxxxxxxxxxxxx /222/
ccc xxxxxxxxxxxxxxxxxxxx /333/
ddd xxxxxxxxxxxxxxxxxxxx /444/
eee xxxxxxxxxxxxxxxxxxxx /555/
fff xxxxxxxxxxxxxxxxxxxx 000
aaa xxxxxxxxxxxxxxxxxxxx /111/
bbb xxxxxxxxxxxxxxxxxxxx /222/
ccc xxxxxxxxxxxxxxxxxxxx /333/
ddd xxxxxxxxxxxxxxxxxxxx /444/
eee xxxxxxxxxxxxxxxxxxxx /555/
fff xxxxxxxxxxxxxxxxxxxx 000
aaa xxxxxxxxxxxxxxxxxxxx /111/
bbb xxxxxxxxxxxxxxxxxxxx /222/
ccc xxxxxxxxxxxxxxxxxxxx /333/
ddd xxxxxxxxxxxxxxxxxxxx 000
eee xxxxxxxxxxxxxxxxxxxx 000
fff xxxxxxxxxxxxxxxxxxxx 000


czyli w efekcie zamienia jak trzeba ale dodaje znaki "/", które musiałem dodać przy definicji zmiennych bo interpreter krzyczał, że ich potrzebuje: preg_replace(): Delimiter must not be alphanumeric or backslash.

Jak się ich pozbyć tylko w tych miejscach, które skrypt dodał?
com
bo tego wymagał 1 parametr czyli pattern a nie to na co zamieniasz, manual http://pl1.php.net/preg_replace

http://ideone.com/Klx1Ze
thepanone
wszystko gra tak jak chciałem


...lecz i tak wszystko na marne

w rzeczywistości mam spory plik xml, który po otwarciu w edytorze tekstowym lub w dreaweaverze jest poczochrany bez stałej ilości wierszy . Otworzyłem go w jakimś viewerze xml online, tam ładnie mi go powierszował, zapisałem to jako .txt, poprzestawiałem z Twoją pomocą powyższym skryptem PHP tak jak chciałem, ale teraz ten plik txt po zamianie na .xml generuje w przeglądarce taki błąd:


"Nie można wyświetlić strony XML
Nie można przeglądać wejścia XML przy użyciu arkusza stylów . Popraw błąd, a następnie kliknij przycisk Odśwież lub spróbuj ponownie później.


--------------------------------------------------------------------------------

Nieprawidłowa wartość na najwyższym poziomie dokumentu. Błąd podczas przetwarzania zasobu 'file:///C:/Documents and Setting...

<?xml version="1.0" encoding="utf-8" ?> "


w zasadzie to już całkiem nowy wątek, ale jeśli wiesz co z tym fantem teraz zrobić to nie czuł bym się jak frajer.
com
skoro to xml to raczej powinieneś tego użyć http://us2.php.net/manual/pl/refs.xml.php tam jest odczyt i zapis itp wink.gif
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.