Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> [PHP] Usuwanie kodowanych i niekodowanych białych znaków ze stringu, Jak usunąć kodowane i niekodowane białe znaki ze stringu?
AmyLokmart
post 28.11.2021, 19:48:23
Post #1





Grupa: Zarejestrowani
Postów: 45
Pomógł: 0
Dołączył: 28.11.2021

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


Mam problem i nie znalazłam odpowiedzi na istniejących tematach dotyczących usuwania kodowanych i niekodowanych białych znaków ze string'u (ciągu tekstowego).
O co dokładnie mi chodzi?:

Pewne dane przekazywane przez funkcje w PHP są kodowane lub nie (ale to wie każdy programista i pasjonata PHP). Te "dane" na przykład wykonywane przez pętlę z tablicy lub kodowanego zewnętrznego źródła przypisane są do zmiennej:

  1. $dane = " \n\r\t to jest ciąg
  2. tekstowy %0D
  3. %0A z kodowanymi i niekodowanymi białymi   znakami   \n\r\t";


Powyższy ciąg tekstowy zapisany w zmiennej "$dane" zawiera różne formy białych znaków.
Chciałabym za pomocą funkcji PHP usunąć kodowane i niekodowane znaki oraz ujednolicić string do postaci:

  1. $dane = "to jest ciąg tekstowy z kodowanymi i niekodowanymi białymi znakami";


Próbowałam użyć funkcji:

1) str_replace()
2) preg_match()
3) preg_match_all()
4) trim()
5) explade()
6) strstr()
7) html_entity_decode()
8) htmlentities()
9) htmlspecialchars_decode()
10) htmlspecialchars()
11) implode()
12) join()
13) substr()
14) stripos()
15) strpos()
16) stristr()
17) strlen()

Powyższe funkcje przetestowałam i żadna nie działa (to znaczy działa kiedy ciąg posiada niekodowane białe spacje lub częściowo działa)
W każdym bądź razie użyte przeze mnie funkcje nie dały zadowalających mnie efektów, ponieważ cały string i tak jest na początku i na końcu przesunięty o spację, a to uniemożliwia mi poprawne zapisanie danych i wykonywanie innych procesów w PHP - dowodem są błędy wyświetlane przez PHP dotyczące tego, że wystąpił niespodziewany błąd, ale funkcja i tak się wykonała częściowo.

Może ktoś wie jak rozwiązać ten problem?

Z Góry dziękuję

Ps: Mimo wszystko będę sama próbować jeszcze, bo nie sprawdziłam wszystkich funkcji.

Ten post edytował AmyLokmart 28.11.2021, 19:49:32
Go to the top of the page
+Quote Post
trueblue
post 28.11.2021, 20:21:26
Post #2





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

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


  1. $dane = trim(preg_replace("/[\s\xc2\xa0]+/", " ", urldecode(html_entity_decode($dane))));


--------------------
Go to the top of the page
+Quote Post
AmyLokmart
post 29.11.2021, 16:46:17
Post #3





Grupa: Zarejestrowani
Postów: 45
Pomógł: 0
Dołączył: 28.11.2021

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


Właśnie skończyłam pracę i zasiadłam do komputera smile.gif

Dziękuję Kochany "TrueBlue" za odpowiedź na mój problem smile.gif
Od razu przetestowałam Twoją podpowiedź w moim skrypcie.

Po wykonaniu podanej kombinacji funkcji, czyli:

  1. $dane = trim(preg_replace("/[\s\xc2\xa0]+/", " ", urldecode(html_entity_decode($dane))));


Nie wyświetliło niczego, a PHP zwrócił błąd w postaci: "The variable does not contain a set. You cannot assign a variable to the same variable in a function that is executing a process on that variable. [...]" i jeszcze kilka innych błędów.
Dokładnie chodzi chyba, o to, że zmienna "$dane" jest po prostu "pusta".

Zmieniłam kod na:

Rozwiązanie 1:

  1. $dane = " \n\r\t to jest ciąg
  2. tekstowy %0D
  3. %0A z kodowanymi i niekodowanymi białymi   znakami   \n\r\t";
  4.  
  5. $result = trim(preg_replace("/[\s\xc2\xa0]+/", " ", urldecode(html_entity_decode($dane))));
  6. print $result; (Wynik: "to jest ci�g tekstowy z kodowanymi i niekodowanymi bia�ymi znakami ")


Od razu napiszę, że funkcję:

1) html_entity_decode()
2) trim()

Sprawdzałam przed wstawieniem tematu i nie dawały one zadowalającego mnie efektu.

Funkcję:

1) preg_replace() / Oraz kombinację:
preg_replace('/abc/', 'efg', $string); (Zamień wszystkie 'abc' z 'efg')
preg_replace('/abc/i', 'efg', $string); (Zamień według dopasowania bez rozróżniania wielkości liter)
preg_replace('/\s+/', '', $dane); (Usuń wszystkie spacje)
preg_replace("/[\s\xc2\xa0]+/", " ") (Usuń spacje według kryterium)
Również sprawdzałam i także bez rezultatów. Funkcja preg_replace() nie interpretuje kodowania, dlatego zakodowane treści w tym unicode jest przepuszczany dalej. Po za tym funkcja ta wrażliwa jest na kodowanie znaków, bo w niektórych systemach jest Latin, innym razem Ascii lub UTF-8, ISO itd i funkcja ma problem, więc nie ujednolici dobrze podanego ciągu tekstowego tylko usunie zwykłą spację nic więcej.

Funkcję:

1) urlencode()
2) urldecode()

Tyczą się dla mojego ciągu tekstowego w znakach: %09, %20 lub "+", %0D%0A (Kolejno: "tabulator", "spacja", "przełamanie do kolejnej lini"). Pierwsza funkcja: urlencode - koduje znaki dla paska adresowego przeglądarki, gdy na przykład wysyłamy dane z formularza, a druga funkcja odkodowuje te dane. Funkcje urlencode() i urldecode() są fajne dla ujednolicenia charset'u. W ciągu tekstowym muszą pojawić się obydwie funkcje jeśli chcemy ujednolicić sposób wyświetlenia (Wyczytałam to w dokumentacji PHP smile.gif)
To kod wyglądałby tak:

Rozwiązanie 2:

  1. $dane = " \n\r\t to jest ciąg
  2. tekstowy %0D
  3. %0A z kodowanymi i niekodowanymi białymi   znakami   \n\r\t";
  4.  
  5. $result = preg_replace('/mi zna/i', 'mi zna', str_replace(" %0D %0A ", " ", str_replace(" ", "", preg_replace('/[\s\xc2\xa0]+/', ' ', trim(urldecode(trim(urlencode($dane), " \n\r\t")), " \n\r\t")))));
  6. print $result; (Wynik: "to jest ci�g tekstowy z kodowanymi i niekodowanymi bia�ymi znakami ")


Przepuściłam oba rozwiązania przez mój kod PHP i wynik jest taki: " to jest ci�g tekstowy z kodowanymi i niekodowanymi bia�ymi znakami " sad.gif
Pozmieniałam też kolejności funkcji: trim(), preg_replace(), str_replace(), urlencode(), urldecode(), a nawet html_entity_decode() i nic sięnie zmieniło, czasem na gorsze.

Mój skrypt przetwarza z pliku tekstowego listę nazw. Za pomocą pętli wypisuje linia po linii dane i zawsze są białe znaki na początku i na końcu string'u (Nawet po użyciu funkcji trim())

Mój skrypt:
  1. $lines = file('dane.vtt');
  2. function CodeMath(int $a, int $b) { return $a + $b; }
  3. foreach ($lines as $line_num => $line) {
  4. echo trim(preg_replace("/[\s\xc2\xa0]+/", " ", urldecode(html_entity_decode(htmlspecialchars($line))))) . "" . CodeMath($line_num) . "<br />";
  5. }


Wynik mojego skryptu:

" Nazwa jeden "
" Nazwa dwa "
" Nazwa trzy "
" Nazwa cztery "
" Nazwa pięć "
" Nazwa sześć "
" Nazwa siedem "
" Nazwa osiem "
" Nazwa dziewięć "
" Nazwa dziesięć "

Wierzę, że w PHP na pewno jest jakieś rozwiązanie tego problemu.

Dziękuje "TrueBlue" za Twój wkład, ale chyba to nie jest jeszcze to rozwiązanie. Może w dokumentacji coś znajdę. I proszę jak coś ktoś znajdzie to napiszcie w tym temacie. Z góry Dzięki smile.gif Pozdrawiam wszystkich, którzy lubią PHP smile.gif

Ten post edytował AmyLokmart 29.11.2021, 16:47:23
Go to the top of the page
+Quote Post
vokiel
post 29.11.2021, 22:15:14
Post #4





Grupa: Zarejestrowani
Postów: 2 592
Pomógł: 445
Dołączył: 12.03.2007

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


Może tak:

Kod
php > echo $dane;

         to jest ciąg
    tekstowy %0D
    %0A z kodowanymi i niekodowanymi białymi&nbsp;&nbsp;&nbsp;znakami &nbsp;

php > echo preg_replace('/\s+/', ' ', preg_replace('/[\x00-\x1F\x7F]/u', '', str_replace('&nbsp;',' ',trim(rawurldecode($dane)))));
to jest ciąg tekstowy z kodowanymi i niekodowanymi białymi znakami


--------------------
Go to the top of the page
+Quote Post
trueblue
post 30.11.2021, 08:28:41
Post #5





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

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


Cytat(AmyLokmart @ 29.11.2021, 16:46:17 ) *
Nie wyświetliło niczego, a PHP zwrócił błąd w postaci: "The variable does not contain a set. You cannot assign a variable to the same variable in a function that is executing a process on that variable. [...]" i jeszcze kilka innych błędów.
Dokładnie chodzi chyba, o to, że zmienna "$dane" jest po prostu "pusta".

http://sandbox.onlinephpfunctions.com/code...2cfa5871e14d08d
W przypadku pustej też działa.


--------------------
Go to the top of the page
+Quote Post
AmyLokmart
post 30.11.2021, 21:41:25
Post #6





Grupa: Zarejestrowani
Postów: 45
Pomógł: 0
Dołączył: 28.11.2021

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


Witam smile.gif

Vokiel Twój przykład:

  1. $dane = " to jest ciąg
  2. tekstowy %0D
  3. %0A z kodowanymi i niekodowanymi białymi&nbsp;&nbsp;&nbsp;znakami &nbsp";
  4.  
  5. echo preg_replace('/\s+/', ' ', preg_replace('/[\x00-\x1F\x7F]/u', '', str_replace('&nbsp;',' ',trim(rawurldecode($dane)))));


Nie działa dobrze. Kodowany znak spacji "&nbsp;" nie został usunięty a ciąg tekstowy nie został ujednolicony i w wyniku wykonania powyższego kodu wyszło:

"to jest ci�g tekstowy %0D %0A z kodowanymi i niekodowanymi bia�ymi(spacja)(spacja)(spacja)znakami(spacja)(spacja)(spacja)"

Przepuściłam wykonanie powyższego kodu w moim skrypcie, który za pomocą pętli "foreach" odczytuje dane z pliku linia po linii i wypisuje co dało efekt:

"(spacja)to jest ci�g tekstowy %0D %0A z kodowanymi i niekodowanymi bia�ymi(spacja)(spacja)(spacja)znakami(spacja)(spacja)(spacja)"

Nieusuniętą Spację w wynikach oznaczyłam jako: (spacja)

W drugim wykonaniu dodało mi spację na początku ciągu i za cholerę nie wiem czemu sad.gif

Podane przez Was funkcje ogólnie działają i sprawdzają się znakomicie w zmiennych, które nie posiadają kodowanych znaków. Sytuacja jest na tyle skomplikowana, ponieważ zależy mi na tym, aby w ciągu tekstowym były znaki kodowane, ale jednocześnie w wynikach zostały przerobione w funkcji i koniecznie ujednolicone. Mam nadzieję, że wiecie chłopaki co znaczy "Ujednolicone".
Próbuję też sama rozwiązać ten problem i testuje różne rozwiązania (Mam serwer domowy z narzędziami PHP program, który wykonuje kod PHP dla różnych wersji PHP)
W większości wyniki wykonania podanych przykładów jakie wystąpiły w tym temacie nie są dobre dla tego co ja bym chciała, ale jednocześnie nie dementuje, że podane funkcje nie działają. Po prostu w pewnym momencie nie jest tak jak sobie towymyśliłam sad.gif

I jeszcze odniosę się do Pana "TrueBlue". Panie Kochany tu nie chodzi, o to, że funkcja będzie działać na pustej zmiennej tylko chodzi, o to, aby były widoczne efekty pracy funkcji z rzeczywistym ciągiem tekstowym, w którym jest problem do rozwiązania. Na pustej zmiennej nie zobaczę efektu.

Muszę przyznać, że nie spodziewałam się tak błachego problemu, który jednocześnie jest bardzo trudny dla mnie do rozwiązania dlatego między innymi piszę na tym forum.

Już do czegoś doszłam SAMA smile.gif

Poniżej mój kod:

  1. $lines = file('dane.vtt');
  2. $first_exe = trim($lines);
  3. $second_exe_1 = trim($first_exe, "\n");
  4. $second_exe_2 = trim($second_exe_1, "\r");
  5. $second_exe_3 = trim($second_exe_2, "\t");
  6. $second_exe_4 = trim($second_exe_3, "&nbsp;");
  7.  
  8. foreach ($second_exe_4 as $line_num => $line) {
  9. echo trim(str_replace(" ", " ", preg_replace("/[\s\xc2\xa0]+/", " ", urldecode($line)))) . "<br />";
  10. }


Wynik powyższego kodu to:

"(spacja)to jest ciąg tekstowy z kodowanymi i niekodowanymi białymi znakami(spacja)"

Nieusuniętą Spację w wynikach oznaczyłam jako: (spacja)

Jak widać udało mi się usunąć potrojoną (spację) we wcześniejszym przykładzie smile.gif

Jeszcze tylko (spacja) na końcu i na początku ciągu tekstowego do usunięcia smile.gif

Czy ktoś ma pomysł jak to zrobić?

Ps: Ktoś mi podpowiedział, że działania funkcji na pliku wstrzymują zmianę pierwszego znaku ze względu na nadpisanie danych w zmiennej "$lines" i trzeba dodatkowo osobno przetworzyć zmienną w celu wykrycia tego co nie zostało wykonane w pierwszej funkcji smile.gif

Ten post edytował AmyLokmart 30.11.2021, 21:45:16
Go to the top of the page
+Quote Post
viking
post 1.12.2021, 07:38:25
Post #7





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

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


A może źle się do tego zabierasz? Widzę że wczytujesz plik .vtt. To może lepiej spróbować np https://github.com/laracasts/transcriptions


--------------------
Go to the top of the page
+Quote Post
vokiel
post 1.12.2021, 09:58:11
Post #8





Grupa: Zarejestrowani
Postów: 2 592
Pomógł: 445
Dołączył: 12.03.2007

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


Jeszcze może być kwestia kodowania pliku, bo może to wcale nie jest UTF-8.


--------------------
Go to the top of the page
+Quote Post
AmyLokmart
post 1.12.2021, 18:26:03
Post #9





Grupa: Zarejestrowani
Postów: 45
Pomógł: 0
Dołączył: 28.11.2021

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


Hej smile.gif To znowu JA smile.gif

Chłopaki dziękuję Wam za wszelkie sugestie odnośnie mojego problemu z usuwaniem kodowanych i niekodowanych białych znaków.

Pakiet analizatora plików VTT jest fajny, na pewno skorzystam z niego niebawem smile.gif Ale nie rozwiązuje on mojego problemu.

Faktycznie dane mam zapisane w pliku .vtt, ale zmieniłam go na plik tekstowy .txt

  1. $lines = file('dane-ASCII.txt');
  2. // $lines = file('dane-UTF-8.txt');
  3. // $lines = file('dane-UNICODE.txt');
  4. $first_exe = trim($lines);
  5. $second_exe_1 = trim($first_exe, "\n");
  6. $second_exe_2 = trim($second_exe_1, "\r");
  7. $second_exe_3 = trim($second_exe_2, "\t");
  8. $second_exe_4 = trim($second_exe_3, "&nbsp;");
  9.  
  10. foreach ($second_exe_4 as $line_num => $line) {
  11. echo trim(str_replace(" ", " ", preg_replace("/[\s\xc2\xa0]+/", " ", urldecode($line)))) . "<br />";
  12. }


Plik o nazwie "dane.txt" zakodowałam w ASCII, UTF-8 i UNICODE i po kolei usuwając komentarz sprawdzałam jak skrypt wykona wybrany plik.
Efekt tych trzech zapisów jest taki sam.
Czyli: "(spacja)to jest ciąg tekstowy z kodowanymi i niekodowanymi białymi znakami(spacja)"
Nieusunięte Spacje w wyniku oznaczyłam jako: (spacja)

Problem w kwestii kodowania zewnętrznego źródła (w tym przypadku danych zapisanych w pliku) wynika ze zbieżności charset'u po stronie użytkownika. Dlatego niektóre funkcje w PHP nie pomogą, gdyż trzeba ustawić całe środowisko z odpowiednim kodowaniem znaków.
Moje kodowanie na serwerze to UTF-8, więc nie powinno być problemu z ASCII i unicode przy zastosowaniu odpowiednich funkcji i znaków.

Szukałam dość długo odpowiedzi na mój problem, aż w końcu trafiłam na specjalistę, który wyjaśnił mi dlaczego tak jest i jak to rozwiązać smile.gif Oczywiście specjalistę od spraw PHP znalazłam w innym serwisie i jeśli mogę to niestety Chłopaki (wybaczcie, ale nie zdradzę nazwy serwisu i nazwy tego Pana - po prostu się trochę namęczyłam szukając właśnie takiej osoby)

A więc do rzeczy.

Dlaczego po wykonaniu skryptu tekst odczytany z zewnętrznego źródła posiada dodatkowe spacje na początku i na końcu mimo, że w pliku ich nie było?
Odpowiedź: ponieważ funkcja przełamując wiersze gubi prawy parametr końca string'u (na chłopski rozum "enter" przenosi wiersz do następnej linii gdzie jest spacja, więc funkcja uznaje, że w poprzedniej linii brakuje spacji i dodaje ją)

Czy z powyższej odpowiedzi wywnioskowaliście coś? smile.gif Wiecie, o jaką funkcję chodzi? smile.gif

Kolejna rzecz.
Skoro funkcja gubi parametr "enter" i spacje zostały dodane to jak je usunąć z początku i końca string'u? Odpowiedz jest prosta: funkcją "trim()".

Jednakże funkcja "trim()" musi wykonać się "bezwzględnie", a nie jak do tej pory próbowaliśmy "względnie". Każdy z nas założył, że zastosowanie funkcji "trim()" będzie logiczne i dostatecznie dobre. Do tego kilka funkcji porównawczych + urldecode() i sprawa załatwiona.
Otóż nie! Aby funkcja "trim()" wykonała się bezwzględnie trzeba użyć więcej podobnych wykonań tej funkcji.
Czy wiecie jak to zrobić i o jakie funkcje chodzi? smile.gif

Odpowiedź ostateczna:

Chodzi, o funkcje:

-> chop()
-> ltrim()
-> rtrim()

Rozwiązanie:

  1. ltrim(rtrim(trim(str_replace(" ", "", str_replace(" ", "", urldecode(urlencode(chop($dane))))), " \n\t\r"), " \n\t\r"), " \n\t\r");


Poprawiony skrypt:

  1. $lines = file('dane.txt'); // Tutaj nie ważne jakie kodowanie ma plik :)
  2. foreach ($lines as $line_num => $line) {
  3. echo ltrim(rtrim(trim(str_replace(" ", "", str_replace(" ", "", urldecode(urlencode(chop($dane))))), " \n\t\r"), " \n\t\r"), " \n\t\r") . "<br />";
  4. }


Uruchomiłam skrypt i DZIAŁA tak jak chciałam smile.gif

===================

Wyświetla: "to jest ciąg tekstowy z kodowanymi i niekodowanymi białymi znakami"

===================

Od razu wytłumaczę co zaszło w rozwiązaniu.
Funkcje: ltrim(), rtrim() i trim() występujące po sobie bezwzględnie usuwają spacje i białe znaki niekodowane z początku i końca ciągu - każda z tych funkcji usuwa podane parametry: " \n\t\r".
Funkcja: chop() przywraca zgubiony parametr "enter" i usuwa białe znaki (nie ważne czy są kodowane czy nie) z PRAWEGO KOŃCA CIĄGU (to jest bardzo istotne - nie z prawej strony tylko z prawego końca a to jest różnica - na początku nie mogłam tego pojąć) - dodatkowo funkcja chop() może przyjmować dodatkowe parametry:
"\0" - zbiór pusty, "\t" - tabulator, "\n" - nowa linia, "\x0B" - pionowa zakładka, "\r" - enter, " " - zwykła biała spacja lub określony ciąg tekstowy.
Funkcje: urlencode() i urldecode() w tym przypadku ujednolicają ciąg tekstowy z pomocą str_replace()
Funkcja: str_replace() w rozwiązaniu usuwa potrojoną spację, a potem podwojoną spację - gdyby było odwrotnie w większych ciągach tekstowych gdzieniegdzie pojawiłyby się podwojone spacje, dlatego istotna jest kolejność wystąpień funkcji.

Teraz mogę przejść dalej ze swoim skryptem smile.gif

Dlaczego nikt nie wpadł na to, aby użyć funkcji: ltrim(), rtrim() i chop()?

Coś czuję, że przede mną jeszcze wiele problemów do rozwiązania z PHP smile.gif

Ten post edytował AmyLokmart 1.12.2021, 18:30:22
Go to the top of the page
+Quote Post
viking
post 1.12.2021, 18:43:54
Post #10





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

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


Dużo tekstu odpowiedzi ale dalej nie rozumiem czemu nie użyjesz gotowego rozwiązania które wyciągnie wszystkie linie, czy nawet umożliwi przekodowanie do innego formatu?


--------------------
Go to the top of the page
+Quote Post
AmyLokmart
post 1.12.2021, 20:11:20
Post #11





Grupa: Zarejestrowani
Postów: 45
Pomógł: 0
Dołączył: 28.11.2021

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


Pętla foreach umożliwia wyciągnięcie wszystkich linii tekstu, a kod:

  1. ltrim(rtrim(trim(str_replace(" ", "", str_replace(" ", "", urldecode(urlencode(chop($dane))))), " \n\t\r"), " \n\t\r"), " \n\t\r")


Umożliwia ujednolicenie string'u i usunięcie kodowanych i niekodowanych białych spacji. Po za tym mój skrypt będzie wykonywał jedno zadanie i nie będzie on wielofunkcyjny na ten moment.
Gotowe rozwiązanie tyczy się transkrypcji ładowania pliku .vtt i jest ono za bardzo obszerne.
Potrzebowałam krótkiej prostej funkcji, która w jednej linijce zrobi to co pakiet w kilkutysiącach linijek kodu.

Podany pakiet vtt zastosuje sobie do innego projektu związanego z napisami, ponieważ plik vtt to sieciowe napisy dla plików audiowizualnych (WEBVTT)
Go to the top of the page
+Quote Post
viking
post 1.12.2021, 20:15:44
Post #12





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

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


W obecnych czasach mało kto pisze samodzielnie coś, co jak widać jest bardzo zawodne. Jakieś str_replace po 2 czy 3 spacjach, chop który jest niczym innym jak aliasem do rtrim itd.


--------------------
Go to the top of the page
+Quote Post
gino
post 1.12.2021, 20:39:52
Post #13





Grupa: Zarejestrowani
Postów: 319
Pomógł: 52
Dołączył: 18.02.2008

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


Ale po co te ltrimi i rtrim po sobie, skoro trim robi to za nie? Chcesz Nam dowieść, że funkcja trim źle działa? Poza tym bez podanych parametrów funkcje trim i tak usunie te znaki.
To co napisał @trublue u mnie działa (używam czegoś podobnego). Albo masz pomieszane kodowanie Twojego tekstu albo co?vChciałbym zobaczyć ten plik vtt. @Viking podał gotowca dlaczego nie skorzystać?

edit:
poza tym Twój kod również nie działa prawidłowo, zakodowany znak spacji dodaje nową spację do tekstu i zamiast jednej są dwie.

Ten post edytował gino 1.12.2021, 21:11:00
Go to the top of the page
+Quote Post
trueblue
post 1.12.2021, 21:35:15
Post #14





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

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


Co ma dawać wywołanie urldecode bezpośrednio na urlencode?
Skrypt nie usuwa znaków %0A %0D oraz &nbsp;

Ten post edytował trueblue 1.12.2021, 21:35:26


--------------------
Go to the top of the page
+Quote Post
gino
post 1.12.2021, 21:49:54
Post #15





Grupa: Zarejestrowani
Postów: 319
Pomógł: 52
Dołączył: 18.02.2008

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


Efekt kodu trueblue i amy tak dla zobaczenia tutaj
Go to the top of the page
+Quote Post
AmyLokmart
post 2.12.2021, 20:12:48
Post #16





Grupa: Zarejestrowani
Postów: 45
Pomógł: 0
Dołączył: 28.11.2021

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


Hej Chłopaki

Sorki, ale kod, który wcześniej podałam w rozwiązaniu:

  1. ltrim(rtrim(trim(str_replace(" ", "", str_replace(" ", " ", str_replace("%0D", "", str_replace("%0A", "", str_replace("&nbsp;", " ", urldecode(urlencode(chop($dane)))))))), " \n\t\r"), " \n\t\r"), " \n\t\r");


To podpowiedź innego użytkownika na innym serwisie i nie uwzględnił on znaków: &nbsp;, %0D i %0A, a ja po prostu skopiowałam ten kod i wkleiłam na forum za co przepraszam.
Zauważyłam błąd i zdefiniowałam brakujące znaki i dodałam do swojego skryptu taki kod:

  1. ltrim(rtrim(trim(str_replace(" ", "", str_replace(" ", " ", str_replace("%0D", "", str_replace("%0A", "", str_replace("&nbsp;", " ", urldecode(urlencode(chop($dane)))))))), " \n\r\t\v\0"), " \n\r\t\v\0"), " \n\r\t\v\0");


UWAGA: w rozwiązaniu można zastosować funckję: html_entity_decode(), ale wtedy proszę usunąć: str_replace("&nbsp;", " ", $string)

Chciałam odnieść się do słów "Vikinga", "Gino" i "TrueBlue"

"Viking": Masz rację: W obecnych czasach mało kto pisze samodzielnie coś, co jak widać jest bardzo zawodne. Jakieś str_replace po 2 czy 3 spacjach, chop który jest niczym innym jak aliasem do rtrim itd.

Jestem początkująca i się uczę. Mam prawo robić błędy, aby je później naprawiać. Szybko się uczę i sama wybrałam, żeby tworzyć samodzielnie i testować swoją pracę. Nawet nie masz pojęcia jaka to radość dla dziewczyny takiej jak ja, jak coś uda mi się zrobić i że to działa tak jak chcę smile.gif
Racja, że coś było nie tak z str_replace(), ale poprawiłam to smile.gif
Odnośnie funkcji chop() i rtrim() to też masz rację, chop() jest aliasem rtrim() i obie funkcje wykonują podobne zadania - usuwają prawy znak z końca ciągu - różnica jednak jest taka, że rtrim nie usuwa kodowanych znaków z prawego końca ciągu lecz z prawej strony. Zresztą mówią, o tym oryginalne definicje tych funkcji:

1) "The chop() function removes whitespaces or other predefined characters from the right end of a string."
2) "The rtrim() function removes whitespace or other predefined characters from the right side of a string."

"Gino": Masz rację: Ale po co te ltrim i rtrim po sobie, skoro trim robi to za nie? Chcesz Nam dowieść, że funkcja trim źle działa? Poza tym bez podanych parametrów funkcje trim i tak usunie te znaki.

trim() na pewno działa poprawnie i z tym nie będę się kłóciła smile.gif Kiedy string jest zawarty tylko w zmiennej trim() poradzi sobie z pierwszym i ostatnim znakiem poprawnie bez określania parametrów - wiem bo sprawdzałam.
Sytuacja komplikuje się, gdy string jest odczytywany z pliku do zmiennej, a ta zmienna przechodzi przez pętle "foreach", wówczas trim() przepuszcza spację ze względu na nadpisanie pliku lub jego kodowanie - w takim przypadku funkcja wykona się poprawnie, ale nie usunie spacji.
Dla zobrazowania tego problemu przedstawie poniżej taką sytuację:

Plik: zawartość("<>to jest zawartość pliku<br />kolejny tekst<>")
Funkcja odczytu: file("dane.txt")
Wczytanie do zmiennej: $dane("(spacja)<>to jest zawartość pliku<br />kolejny tekst<>(spacja)");
Pętla: foreach($dane)
Funkcja trim: trim("(spacja)<>to jest zawartość pliku<br />kolejny tekst<>(spacja)");
Wynik:
"<>to jest zawartość pliku
(spacja)kolejny tekst<>";

Legenda:
<> - kodowana spacja
<br /> - przełamanie linii
(spacja) - spacja po przełamaniu linii

Jak widać trim() usunęło spację z prawej i lewej strony i zadziałało dobrze, ale nie usunęło kodowanej spacji więc i tak spacja została również nie usunęło spacji po przełamaniu linii i tu z pomocą przychodzi funkcja chop(), która usuwa spację po przełamaniu linii w odczycie stringu z pliku czego nie robi trim() - to jest ta mała różnica smile.gif
Aby wymusić usunięcie z prawej i lewej strony usunięcie spacji po przeczytaniu treści z pliku w pętli należy wywołać następujące po sobie funkcje, które wykonują podobny zakres działania.
Autor do tego celu użył: ltrim() i rtrim() czyli:

  1. ltrim(rtrim(trim($dane)));


ale można też zrobić tak:

  1. trim(trim($dane)); // ponieważ w stringu znajdują się z prawej i lewej strony dwie spacje po odczycie z pliku


Jeszcze odnośnie parametrów w trim()

1) ltrim($dane, " \n\r\t\v\0");
2) rtrim($dane, " \n\r\t\v\0");
3) trim($dane, " \n\r\t\v\0");

Zostały one określone specjalnie, ponieważ mimo, że w domyśle funkcja usuwa "\n\r\t" to my chcemy aby robiła to bezwzględnie - zamiast tego mogło by być np: "mama"

"TrueBlue": Co ma dawać wywołanie urldecode bezpośrednio na urlencode?

urldecode() i urlencode() w zasadzie w rozwiązaniu niczego nie wnoszą po za tym że kodują znaki spacji, unicode, niektóre znaki z tablicy ASCII i odkodowują je do postaci pierwotnej.
W bliższym znaczeniu funkcje te ujednolicają string przy założeniu w jaki sposób ma się zachowywać string (ale na razie niczego nie wymyśliłam, więc nie zmieniam kolejności) - to chodzi, o kolejność wystąpienia funkcji urldecode() i urlencode() w rozwiązaniu jeśli będę chciała coś wykombinować przy pomocy tych funkcji smile.gif


"Gino" przedstawił ładnie wykonanie funkcji dla przykładu, ale mi nie chodziło o plik .vtt (na początku po prostu się pomyliłam - myślałam, że używam pliku tekstowego, a to był plik vtt)
Mimo wszystko w przykładzie:

WEBVTT
Kind: captions
Language: en

00:09.000 --> 00:11.000
We are in New York City

00:11.000 --> 00:13.000
We are in New York City

Są puste linie, a mój skrypt wypisuje w każdej lini jakiś string i nie wiadomo, czy "gino" przepuścił swój przykład przez pętle odczytując plik czy może treść zawarł w zmiennej.

W każdym bądź razie sprawa jest rozwiązana smile.gif Przynajmniej dla mnie. Będę używać mojego rozwiązania, które teraz podałam poprawione. smile.gif

Dziękuję Wam Chłopaki za zainteresowanie i za wszelką pomoc. Bardzo Pozdrawiam smile.gif

Ten post edytował AmyLokmart 2.12.2021, 20:24:51
Go to the top of the page
+Quote Post
trueblue
post 2.12.2021, 20:29:25
Post #17





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

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


Fajnie, że ktoś spoza forum Ci pomógł.
Jednak odnoszę wrażenie, że w kodzie może jeszcze brakować kilku trim oraz str_replace.


--------------------
Go to the top of the page
+Quote Post
AmyLokmart
post 2.12.2021, 21:49:11
Post #18





Grupa: Zarejestrowani
Postów: 45
Pomógł: 0
Dołączył: 28.11.2021

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


Kochaniutki TrueBlue jak wiesz co jeszcze można poprawić to proszę przeanalizuj moje rozwiązanie:

  1. ltrim(rtrim(trim(str_replace(" ", "", str_replace(" ", " ", str_replace("%0D", "", str_replace("%0A", "", str_replace("&nbsp;", " ", urldecode(urlencode(chop($dane)))))))), " \n\r\t\v\0"), " \n\r\t\v\0"), " \n\r\t\v\0");


i napisz w odpowiedzi smile.gif

Będę oczywiście wdzięczna za poprawki i dodatkowe sugestie smile.gif
Go to the top of the page
+Quote Post
gino
post 3.12.2021, 07:00:19
Post #19





Grupa: Zarejestrowani
Postów: 319
Pomógł: 52
Dołączył: 18.02.2008

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


Cytat
...ale mi nie chodziło o plik .vtt (na początku po prostu się pomyliłam - myślałam, że używam pliku tekstowego, a to był plik vtt)
Tego to ja nie rozumiem.
I tak został załadowany plik vtt i przepuszczony przez pętle foreach i tak jak było u Ciebie każda linia została specjalnie odseparowana <br>
Go to the top of the page
+Quote Post
AmyLokmart
post 3.12.2021, 08:14:51
Post #20





Grupa: Zarejestrowani
Postów: 45
Pomógł: 0
Dołączył: 28.11.2021

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


"Gino" myślę, że czy to jest plik .vtt lub .txt nie ma znaczenia, bo kodowanie jest takie samo.
Masz rację, że każda linia została odseparowana przełamaną linią "<br />", ale w przykładzie z plikiem.vtt występują puste linie a nie ciąg tekstowy.
Białe znaki są częścią ciągu tekstowego, ale nie są one tekstem.
Tekst to forma grafiki nazywany "czcionką", więc nie potrzebuje pustych linii.
W swoim przykładzie (jeśli naprawdę przepuściłeś odczyt pliku do zmiennej, a potem do pętli) to użyj teraz poprawionego rozwiązania:

  1. ltrim(rtrim(trim(str_replace(" ", "", str_replace(" ", " ", str_replace("%0D", "", str_replace("%0A", "", str_replace("&nbsp;", " ", urldecode(urlencode(chop($dane)))))))), " \n\r\t\v\0"), " \n\r\t\v\0"), " \n\r\t\v\0"); // DOBRZE


ponieważ poprzednie jest błędne (co zresztą przyznałam wcześniej)

  1. ltrim(rtrim(trim(str_replace(" ", "", str_replace(" ", "", urldecode(urlencode(chop($dane))))), " \n\t\r"), " \n\t\r"), " \n\t\r"); // ŹLE
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
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 Wersja Lo-Fi Aktualny czas: 19.04.2024 - 03:50