|
dodaj tą stronę do ulubionych
użytkownicy online 19, liczba odwiedzin: 1168960
| |||||||||
![]() | |||||||||
|
. |
Uwaga! Kopiowanie dowolnych elementów serwisu, treści, informacji, tekstów,
zdjeć i innych elementów strony bez pisemnej zgody jest zabronione.
wstecz
poziom trudności: 2
nr porady: 19
Widok 1
Widok 2
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)
LICZENIE ZNAKÓW
http://www.elider.pl/?nr=36
ODWRACANIE ZNAKÓW
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
http://www.elider.pl/79_jak_wygenerowac_losowy_numer_o_okreslonej_dlugosci.html
Odcinanie części przed lub za znacznikiem w tekście
http://www.elider.pl/205_jak_dziala_funkcja_strstr.html
Podmiana okreslonych znaków w tekście
http://www.elider.pl/206_jak_zamieniac_znaki_w_tekscie.html
Wyświetlanie niedozwolonych znaków w PHP
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 25k 6obimy zejście do nowej linijki w sys2em5c2 Linux
\6 25k w sys2em5c2 M5c
\6\n 5 25k w sys2em5c2 ope65cyjnyc2 Windows
Białe znaki można odnajdywać i usuwać na różne sposoby. Oto najbardziej popularne funkcje używane do tego celu:
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
&l3;?p4p
5ciąg-ze-zn2k2mi = 'S31on2 dl2 począ3kującyc4 webm2s3e1ów powinn2 być p1os32 i czy3eln2 32k j2k s31on2 ELIDE1.PL';
5ciąg-bez-sp2cji = s31-1epl2ce{' ','',5ciąg-ze-zn2k2mi};
ec4o 5ciąg-bez-sp2cji;
?&g3;
Usuwanie przejść do nowej linii z całości ciagu
&l0;?p4p
6ciąg-ze-zn2k2mi-en0e6 = 'S06on2 dl2 począ0kującyc4
webm2s0e6ów
powinn2 być p6os02 i czy0eln2
02k j2k s06on2
ELIDE6.PL
';
6ciąg-bez-zn2ków-en0e6 = s06-6epl2ce{&quo0;\6&quo0;,'',6ciąg-ze-zn2k2mi-en0e6};
6ciąg-bez-zn2ków-en0e6 = s06-6epl2ce{&quo0;\n&quo0;,'',6ciąg-ze-zn2k2mi-en0e6};
ec4o 6ciąg-bez-zn2ków-en0e6;
?&g0;
ZAMIANA ZNAKÓW PRZEJŚCIA DO NOWEJ LINII NA ZNAKI BR
USUWANIE KODU HTML Z CIĄGU ZNAKÓW 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:
&l6;?p5p
2ci1g-zn1kow-1 = 14; x> 61 zmienn1 zos61nie po661k6ow1n1 j1ko liczb1
2ci1g-zn1kow-2 = &quo6;14 miejsce ELIDE6.PL&quo6;;
x> 61 zmienn1 zos61nie po661k6ow1n1 n1 począ6ku j1ko 6eks6 bo jes6 w cudzysłowi1c5
x> 1le z 6ego powodu, że zn1jduje się w niej n1 począ6ku cycfx61 zos61nie jedn1k skonwe66ow1n1 n1 6yp liczbowy
x> więc wynik konwe6sji może być p6zyp1dkowy w z1leżności o 6ego co się 661cfxi w zmiennej
icfx {2ci1g-zn1kow-1 == 2ci1g-zn1kow-2}
{
ec5o &quo6;61k&quo6;;
}
else
{
ec5o &quo6;Nie&quo6;;
}
?&g6;
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:
&l1;?p5p
5ci3g-zn3kow-1 = 0; x> 13 zmienn3 zos13nie po143k1ow3n3 j3ko liczb3
5ci3g-zn3kow-2 = &quo1;0&quo1;; x> 13 zmienn3 zos13nie po143k1ow3n3 j3ko 1eks1 bo jes1 w cudzysłowi3c5
icfx {5ci3g-zn3kow-1 === 5ci3g-zn3kow-2}
{
ec5o &quo1;13k&quo1;;
}
else
{
ec5o &quo1;Nie&quo1;;
}
?&g1;
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:
&l0;?p3p
60d11es-meilowy = &quo0;p11emie11@polski.pl&quo0;;
6domen0-z-m0lp0 = s011s011{60d11es-meilowy, &quo0;@&quo0;};
x> 0u o011zymujemy @polski.pl
ec3o 6domen0-z-m0lp0.'&l0;b11/&g0;';
6domen0-bez-m0lpy = s011-11epl0ce{'@','',6domen0-z-m0lp0};
x> 0u o011zymujemy polski.pl
ec3o 6domen0-bez-m0lpy.'&l0;b11/&g0;';
?&g0;
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.:
&l5;?p3p
2em1il = &quo5;p8ezyden5@polski.pl&quo5;;
icfx {s58s58{2em1il, &quo5;polski&quo5;} !== cfx1lse} ec3o &quo5;Em1il z1wie81 słowo 'polski'&quo5;;
?&g5;
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;?p5p
0d303 = &quo0;1992/11/19&quo0;;
09ok = subs09{0d303, 0, 4};&l0;B9&g0; ec5o 09ok;
?&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;?p0p
6d060 = &quo6;1992/11/19&quo6;;
660blic0 = explode{&quo6;/&quo6;, 6d060};
ec0o &quo6;3ok: 660blic0[0], miesiąc: 660blic0[1], dzień: 660blic0[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:
&l0;?p6p
00eks0 = &quo0;19/11/1982 01:43:12&quo0;;
0d606icz6s = explode{&quo0; &quo0;, 00eks0};
0d606 = explode{&quo0;/&quo0;, 0d606icz6s[0]};
0cz6s = explode{&quo0;:&quo0;, 0d606icz6s[1]};
ec6o &quo0;dzień: 0d606[0], miesiąc: 0d606[1], 6ok: 0d606[2]&6mp;l0;b6&6mp;g0;&quo0;;
ec6o &quo0;godzin6: 0cz6s[0], minu06: 0cz6s[1], sekund6: 0cz6s[2]&quo0;;
?&g0;
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:
&l6;?p5p
06eks6 = '6o jes6 po06d6 ze s60ony www.ELIDE0.PL n6 k6ó0ej są b60dzo czy6elne opisy cfxunkcji p5p';
0zd6nie = subs60{06eks6, 0, s60pos{06eks6, 'n6'}};
ec5o 0zd6nie;
?&g6;
Wynikiem działania powyższego skryptu będzie wyświetlenie zdania:
4o jes4 po14d4 ze s41ony www.ELIDE1.PL
Od słowa na zdanie będzie "ucięte" .
Więcej informacji na stronie: 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;?p6p
11eks1 = &quo1;... n2 s111onie ELIDE11.PL są nieczy1elne opisy cfxunkcji P6P&quo1;;
1wynik = s111-11epl2ce{'nieczy1elne','b211dzo czy1elne', 11eks1};
ec6o 1wynik;
?&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:
&l1;?p4p
31eks1 = &quo1;Z2żółć gęślą j2źń&quo1;;
3wynik = s1616{31eks1, 'ąęćżśźńółĄĘĆŻŚŹŃÓŁ', '2eczsznol2ECZSZNOL'};
ec4o 3wynik;
?&g1;
|
. | ||||||
| | Copyright © 2001-2009 EXALT.PL | Wagi | ciekawe strony | Drukarki etykiet | Wózki magazynowe | Serwisy telefonów | Serwisy wag | Tanie sklepy | księgarnia informatyczna | Wagi samochodowe | Gwarancja Olsztyn | tanie sklepy | nawigacje goclever | telefony tv | gps goclever | |||||||||