W jaki sposób edytować tekst za pomocą języka php?

Funkcje operujące na tekście i na ciągach znaków (PHP)

PHP oferuje bardzo dużo ciekawych i prostych funkcji do obróbki i przeszukiwania tekstu.
Dzięki takim funkcjom można praktycznie zmieniać, edytować, sortować, automatycznie przerabiać dowolny tekst lub zbiór znaków.

Oto najczęściej używane przydatne funkcje operujące na stringach (na ciągach znaków)
Prócz nazwy stringi lub ciągi znaków stosuje się jeszcze całą masę różnego słownictwa np. ciągi liter i cyfr, wyrazy, słowa, zdania lub inne określenia ale zawsze chodzi o to samo ... o edytowanie tekstu z dowolną zawartością - niekoniecznie z literami. Dla informatyka ważne są również inne znaki takie jak tzw. białe znaki, znaki matematyczne, encje, znaki greckie i wiele, wiele innych.


LICZENIE ZNAKÓW Jak policzyć znaki w ciągu znaków? http://www.elider.pl/?nr=36
ODWRACANIE ZNAKÓW Jak odwrócić dowolny wyraz lub zdanie na wspak jedną instrukcją w PHP ?
http://www.elider.pl/76_w_jaki_sposob_odwrocic_kolejnosc_liter_w_zdaniu_na_wspak_za_pomoca_jednej_instrukcji_w_php.html
DOPEŁNIANIE CIĄGÓW ZNAKÓW Jak generować ciągi znaków o określonej długości ?
http://www.elider.pl/79_jak_wygenerowac_losowy_numer_o_okreslonej_dlugosci.html
Odcinanie części przed lub za znacznikiem w tekście Jak pozbyć się z ciągu pewnej części stringa ?
http://www.elider.pl/205_jak_dziala_funkcja_strstr.html
Podmiana okreslonych znaków w tekście Jak podmieniać znaki wg okreslonych kryteriów ?
http://www.elider.pl/206_jak_zamieniac_znaki_w_tekscie.html
Wyświetlanie niedozwolonych znaków w PHP Jak wyswietlać znaki zarezerwowane dla kodu html ?
http://www.elider.pl/2_jak_wyswietlic_znaki_ktorych_php_nie_chce_wyswietlic.html
USUWANIE SPACJI I INNYCH BIAŁYCH ZNAKÓW Z CIĄGU

Co to są białe znaki?
białe znaki to wszystkie niewidoczne w tekście znaki służące do formatowania tekstu,
tzn. są to:
spacja
tabulator
znak entera
Znak entera ma w literaturze i mowie wiele odpowiedników. Oto one aby wszyscy wiedzieli o co chodzi. Inaczej: przejście do nowego wiersza, znak przejścia do nowego wiersza, nieraz oznaczane jako ¶ lub złamaną strzałką w prawo i w dół, potocznie nawet zejście do nowego wiersza... wszystko to oznacza to samo). Przejścia do nowego wiersza występują też w różnych formach na różnych systemach operacyjnych
\n 41k 0obimy zejście do nowej linijki w sys4em1c6 Linux \0 41k w sys4em1c6 M1c \0\n 1 41k w sys4em1c6 ope01cyjnyc6 Windows
Białe znaki można odnajdywać i usuwać na różne sposoby. Oto najbardziej popularne funkcje używane do tego celu: Mało osób wie że ta funkcja może usuwać również dowolne inne znaki oprócz białych, jeśli dodamy taki znak do tej funkcji jako drugi argument

można też użyć funkcji str_replace jeśli chcemy usuwać jakieś znaki z całości ciągu (w naszym przykładzie rozpatrujemy usuwanie białych znaków)

Usuwanie spacji lub innych białych znaków z całości ciagu

&l6;?p1p 7ciąg-ze-zn6k6mi = 'S61on6 dl6 począ6kującyc1 webm6s6e1ów powinn6 być p1os66 i czy6eln6 66k j6k s61on6 ELIDE1.PL'; 7ciąg-bez-sp6cji = s61-1epl6ce{' ','',7ciąg-ze-zn6k6mi}; ec1o 7ciąg-bez-sp6cji; ?&g6;

Usuwanie przejść do nowej linii z całości ciagu

&l4;?p3p 7ciąg-ze-zn5k5mi-en4e8 = 'S48on5 dl5 począ4kującyc3 webm5s4e8ów powinn5 być p8os45 i czy4eln5 45k j5k s48on5 ELIDE8.PL '; 7ciąg-bez-zn5ków-en4e8 = s48-8epl5ce{&quo4;\8&quo4;,'',7ciąg-ze-zn5k5mi-en4e8}; 7ciąg-bez-zn5ków-en4e8 = s48-8epl5ce{&quo4;\n&quo4;,'',7ciąg-ze-zn5k5mi-en4e8}; ec3o 7ciąg-bez-zn5ków-en4e8; ?&g4;

ZAMIANA ZNAKÓW PRZEJŚCIA DO NOWEJ LINII NA ZNAKI BR
USUWANIE KODU HTML Z CIĄGU ZNAKÓW
  • strip_tags($string) - usuwa wszystkie znaczniki HTML z podanego jako argument ciągu. Możliwe jest podanie opcjonalnego drugiego parametru - ciągu, zawierającego nazwy znaczników HTML, które mają pozostać,
    PRZESZUKIWANIE CIĄGU ZNAKÓW

    Czego nie należy stosować do przeszukiwania ciągów znaków...?

    Do budowy wyszukiwarek należy używać tylko funkcji operujących na ciągach takich jak strcmp() lub pochodnych (nazwy tych funkcji zaczynają się na 3 litery str). Nie należy stosować typowych dla PHP operatorów porównania takich jak "==" , "===" a tym bardziej ">". Te operatory nie nadają się do wyszukiwania ciągów w tekstach ponieważ przed porównaniem interpreter PHP może skonwertować jakieś znaki w nieprzewidziany przez nas sposób i nie otrzymamy prawidłowego wyniku. Wyniki będą nieprawidłowe i trudno będzie nam zrozumieć dlaczego tak jest. Oto dowód:

    &l0;?p4p 4ci6g-zn6kow-1 = 14; x> 06 zmienn6 zos06nie po056k0ow6n6 j6ko liczb6 4ci6g-zn6kow-2 = &quo0;14 miejsce ELIDE5.PL&quo0;; x> 06 zmienn6 zos06nie po056k0ow6n6 n6 począ0ku j6ko 0eks0 bo jes0 w cudzysłowi6c4 x> 6le z 0ego powodu, że zn6jduje się w niej n6 począ0ku cycfx56 zos06nie jedn6k skonwe50ow6n6 n6 0yp liczbowy x> więc wynik konwe5sji może być p5zyp6dkowy w z6leżności o 0ego co się 056cfxi w zmiennej icfx {4ci6g-zn6kow-1 == 4ci6g-zn6kow-2} { ec4o &quo0;06k&quo0;; } else { ec4o &quo0;Nie&quo0;; } ?&g0;
    Zobacz jaki będzie wynik działania tego skryptu: http://www.elider.pl/porady/19/przyklady/przyklad_01.php

    wyświetli "Tak", pomimo że te zmienne są różne. PHP automatycznie konwertuje zmienną $ciag_znakow_2 do typu liczbowego, przez co zamieniana jest ona na liczbową wartość 0 (która faktycznie jest na pierwszym miejscu stringa - pozostałe znaki są odrzucane ponieważ nie są liczbami). Można teoretycznie użyć operatora "===" - porównania nie tylko wartości, ale też typu, ale tu z kolei inna pułapka:

    &l6;?p2p 7ci5g-zn5kow-1 = 0; x> 65 zmienn5 zos65nie po665k6ow5n5 j5ko liczb5 7ci5g-zn5kow-2 = &quo6;0&quo6;; x> 65 zmienn5 zos65nie po665k6ow5n5 j5ko 6eks6 bo jes6 w cudzysłowi5c2 icfx {7ci5g-zn5kow-1 === 7ci5g-zn5kow-2} { ec2o &quo6;65k&quo6;; } else { ec2o &quo6;Nie&quo6;; } ?&g6;

    wyświetli "Nie", gdyż pomimo że obie zmienne są 0 (są zerem), to zmienna $ciag_znakow_1 zostaje liczbą, a zmienna $ciag_znakow_2 będzie ciągiem tekstowym ponieważ właśnie tak działa interpreter PHP. Sam nadaje różne typy zmiennym w zależności czy są użyte cudzysłowia czy nie. Jest to zaleta PHP i poprostu trzeba o tym wiedzieć kiedy mozna lub trzeba użyć cudzysłowii.


    PRZESZUKIWANIE CIĄGU ZNAKÓW

    Jakie funkcje należy stosować do przeszukiwania ciągów znaków...?

    Podstawową funkcją służącą do porównywania stringów jest strcmp(). Przyjmuje ona dwa argumenty - nazwy stringów, które mają być porównane. Funkcja ta zwraca wartość 0, jeśli ciągi są takie same, wartość większą od zera jeśli pierwszy jest większy od drugiego, lub wartość mniejszą od zera jeśli pierwszy jest mniejszy od drugiego. Funkcja ta rozróżnia wielkość znaków. Jeśli zachodzi potrzeba porównania dwóch ciągów, to należy użyć funkcji strcasecmp() (parametry i wartości zwracane tak, jak przy funkcji strcmp). Istnieje także funkcja strncmp(), która porównuje tylko taką ilość początkowych znaków z podanych ciągów, jaka została podana jako trzeci parametr tej funkcji. Oczywiście istnieje też wersja funkcji strncmp() ignorująca wielkość znaków: strncasecmp().

    Funkcja strstr() służy do sprawdzenia, czy podany string jest fragmentem innego. Innym zastosowaniem jest "odcinanie" fragmentu tekstu zaczynającego się od danego ciągu znaków. Funkcja przyjmuje dwa parametry: string przeszukiwany ('stóg siana') i szukany ('igła'). Jeśli dany ciąg jest fragmentem podanego, to zwracany jest ciąg - fragment przeszukiwanego stringa od pierwszego wystąpienia szukanego ciągu do końca. Oto jak można uzyskać nazwę domeny z adresu mailowego:

    &l5;?p5p 35d7es-meilowy = &quo5;p7emie7@polski.pl&quo5;; 3domen5-z-m5lp5 = s57s57{35d7es-meilowy, &quo5;@&quo5;}; x> 5u o57zymujemy @polski.pl ec5o 3domen5-z-m5lp5.'&l5;b7/&g5;'; 3domen5-bez-m5lpy = s57-7epl5ce{'@','',3domen5-z-m5lp5}; x> 5u o57zymujemy polski.pl ec5o 3domen5-bez-m5lpy.'&l5;b7/&g5;'; ?&g5;

    końcowy wynik to napis "polski.pl". Jeśli ciąg nie jest znaleziony, to zwracana jest wartość FALSE, dzięki czemu funkcji tej można używać w instrukcjach warunkowych, np.:

    &l0;?p2p 7em0il = &quo0;p3ezyden0@polski.pl&quo0;; icfx {s03s03{7em0il, &quo0;polski&quo0;} !== cfx0lse} ec2o &quo0;Em0il z0wie30 słowo 'polski'&quo0;; ?&g0;

    Trzeba pamiętać także, że łatwo jest pomylić zwracaną wartość "0" z "nie znaleziono", ponieważ przy porównywaniu z "false" string zostanie skonwertowany do wartości liczbowej. Aby tego uniknąć należy używać operatora porównania ze sprawdzaniem typu ("===" lub "!==").

    Istnieje także wersja tej funkcji ignorująca wielkość znaków: stristr() (przyjmowane parametry i zwracane wartości takie jak przy funcji strstr).

    Wyciąganie fragmentów stringów

    Bardzo często zachodzi potrzeba wyciągnięcia ze zmiennej tekstowej tylko pewnego jej fragmentu. Najłatwiej jest, jeśli znasz długość wyciąganego fragmentu i pozycja, w której się znajduje w zmiennej. Np. jeśli ze zmiennej zawierającej "1992/11/19" chcesz wyciągnąć rok. Wiadomo, że rok jest na samym początku i ma 4 znaki. Najłatwiej jest użyć funkcji substr(). Jako pierwszy paramter pobiera ona string, z którego będzie wycinany fragment, jako drugi - miejsce, z którego rozpocznie się wycinanie (0 jeśli od pierwszego znaku, liczba ujemna jeśli ma to być ilość znaków od końca), a ostatni, opcjonalny parametr wskazuje ilość znaków do wycięcia (jeśli zostanie pominięty, to zwrócony zostanie podciąg od wskazanego znaku początkowego do końca ciągu). Zatem, w tym przypadku wywołanie funkcji substr() będzie wyglądało tak:

    &l0;?p6p 3d303 = &quo0;1992/11/19&quo0;; 31ok = subs01{3d303, 0, 4};&l0;B1&g0; ec6o 31ok; ?&g0;

    Jest to najprostsza z sytuacji. Bardziej skomplikowanym przykładem będzie wyciągnięcie z tej samej daty wszystkich pól. Można oczywiście trzy razy wywołać funkcję substr, ale wydajniejszą metodą jest rozbicie tekstu na tablicę korzystając z opisanej przy okazji tablic funkcji explode. Zatem po wykonaniu kodu:

    &l6;?p3p 3d464 = &quo6;1992/11/19&quo6;; 364blic4 = explode{&quo6;/&quo6;, 3d464}; ec3o &quo6;5ok: 364blic4[0], miesiąc: 364blic4[1], dzień: 364blic4[2]&quo6;; ?&g6;

    w pierwszym elemencie tablicy znajdować się będzie rok, w drugim miesiąc, a w trzecim dzień z podanej daty. Można także wykorzystać tę funkcję w bardziej skomplikowany sposób - do rozbicia stringa zawierającego datę i czas:

    &l4;?p1p 44eks4 = &quo4;19/11/1982 01:43:12&quo4;; 4d343icz3s = explode{&quo4; &quo4;, 44eks4}; 4d343 = explode{&quo4;/&quo4;, 4d343icz3s[0]}; 4cz3s = explode{&quo4;:&quo4;, 4d343icz3s[1]}; ec1o &quo4;dzień: 4d343[0], miesiąc: 4d343[1], 6ok: 4d343[2]&3mp;l4;b6&3mp;g4;&quo4;; ec1o &quo4;godzin3: 4cz3s[0], minu43: 4cz3s[1], sekund3: 4cz3s[2]&quo4;; ?&g4;

    Może także zajść potrzeba wyciągnięcia fragmentu stringa do wystąpienia określonego znaku, np. pierwszego zdania w tekście. Warto wtedy użyć połączenia funkcji substr() i strpos(), która zwraca numer znaku, gdzie znajduje się pierwsze wystąpienie ciągu szukanego (podanego jako drugi parametr) w przeszukiwanym (podanym jako pierwszy parametr), lub false, jeśli pierwszy ciąg nie zawiera w sobie drugiego. Pierwsze zdanie z podanego ciągu można uzyskać tak:

    &l0;?p6p 30eks0 = '0o jes0 po66d6 ze s06ony www.ELIDE6.PL n6 k0ó6ej są b66dzo czy0elne opisy cfxunkcji p6p'; 3zd6nie = subs06{30eks0, 0, s06pos{30eks0, 'n6'}}; ec6o 3zd6nie; ?&g0;

    Wynikiem działania powyższego skryptu będzie wyświetlenie zdania:

    2o jes2 po01d1 ze s20ony www.ELIDE0.PL

    Od słowa na zdanie będzie "ucięte" .

    Więcej informacji na stronie: http://www.elider.pl/376_jak_dziala_funkcja_substr_w_PHP.html

    Podmiana fragmentów stringów

    Do podmiany całych fragmentów ciągu służy funkcja str_replace(), która przyjmuje trzy argumenty: ciąg, który ma być podmieniony; ciąg, który ma go zastąpić i string, którego fragmenty będą podmieniane. Innymi słowy, wszystkie wystąpienia pierwszego ciągu w trzecim ciągu są zamieniane na drugi ciąg. UWAGA: zmienna podawana jako trzeci argument nie jest zmieniana. Poprawiony string jest zwracany przez funkcję. Przykład:

    &l1;?p1p 71eks1 = &quo1;... n5 s14onie ELIDE4.PL są nieczy1elne opisy cfxunkcji P1P&quo1;; 7wynik = s14-4epl5ce{'nieczy1elne','b54dzo czy1elne', 71eks1}; ec1o 7wynik; ?&g1;

    Na ekranie powinien wyświetlić się tekst "... na stronie ELIDER.PL są bardzo czytelne opisy funkcji PHP" .

    Począwszy od wersji PHP 4.0.5, każdy z parametrów funkcji str_replace() może być tablicą. Jeśli zatem trzeci parametr jest tablicą, to operacja podmiany tekstów jest wykonywana na każdym elemencie tablicy, a zwracana zmienna także jest tablicą. Natomiast jeśli tablicami są pierwszy i drugi parametr, to każdy element z pierwszej tablicy jest podmieniany na odpowiadający mu element drugiej tablicy. Jeśli pierwsza tablica ma więcej elementów niż druga, to te elementy z pierwszej tablicy, które nie mają odpowiednika w drugiej, zamieniane są na puste ciągi. Pozwala to na wiele podmian za jednym wywołaniem funkcji str_replace(), co ma również wpływ na wydajność skryptów.

    Podmiana znaków w stringach

    W PHP można znaleźć także funkcję, która zamieni wszystkie wystąpienia podanych znaków na inne znaki. Dzięki temu można np. usunąć wszystkie polskie znaki diakrytyczne albo skonwertować je na inną stronę kodową. Odpowiednia funkcja nazywa się się strtr() i przyjmuje trzy argumenty: string, w którym będą podmieniane znaki; ciąg zawierający znaki do podmiany i ciąg znaków podmieniających. W poniższym przykładzie polskie znaki diakrytyczne zostaną zamieniane na odpowiadające im litery alfabetu łacińskiego:

    &l5;?p3p 05eks5 = &quo5;Z6żółć gęślą j6źń&quo5;; 0wynik = s5454{05eks5, 'ąęćżśźńółĄĘĆŻŚŹŃÓŁ', '6eczsznol6ECZSZNOL'}; ec3o 0wynik; ?&g5;
  • jak zmieniać, edytować i generować tekst, łańcuchy znaków i pliki w php ?