Programowanie na potrzeby internetu niemal zawsze wiąże się z przeprowadzaniem operacji na zmiennych przechowujących napisy. PHP oferuje bogaty zestaw funkcji ułatwiających pracę z napisami. Pozwalają one na konwersję napisów pomiędzy różnymi stronami kodowymi polskich znaków (i oczywiście nie tylko polskich), wycinanie fragmentów napisów, porównywanie, wyszukiwanie wzorców itd.
Konwersja polskich znaków
Zdarza się, że podczas pracy nad stroną występuje konieczność konwersji polskich znaków pomiędzy kilkoma różnymi standardami – np. strona może być oparta o UTF-8, podczas gdy trzeba dokonać importu pewnych danych z pliku w którym polskie znaki zakodowane są zgodnie ze standardem CP1250 (znanym także jako Windows-1250). W podobnych sytuacjach z pomocą przychodzi biblioteka iconv. Dostarcza ona funkcję o takiej samej nazwie ({stala}iconv{/stala}) pozwalającą na łatwe dokonywanie konwersji kodowania znaków narodowych. Funkcja ta przyjmuje trzy parametry:
- nazwę kodowania w jakim zapisane są znaki w tekście, który ma zostać przekonwertowany,
- nazwę kodowania w jakim mają zostać zapisane znaki po dokonaniu konwersji,
- napis, który ma zostać poddany konwersji.
W wyniku działania funkcja ta zwraca przekonwertowany napis:
Wyszukiwanie tekstu w napisie
Ważną operacją na napisach jest wyszukiwanie w nim zadanych ciągów znaków. PHP dostarcza kilku funkcji wykonujących to zadanie.
FUNKCJE STRPOS, STRRPOS, STRIPOS, STRRIPOS
Wszystkie te funkcje działają bardzo podobnie – wyszukują w napisie podanym w pierwszym parametrze napisu z parametru drugiego, a w wyniku swojego działania zwracają pozycję odnalezionego ciągu znaków. Jeśli funkcja nie odnajdzie poszukiwanego ciągu znaków, zwróci wartość false.
Różnice miedzy funkcjami:
- {stala}strpos{/stala} – poszukuje pierwszego wystąpienia poszukiwanego ciągu znaków w napisie podanym w pierwszym parametrze,
- {stala}strrpos{/stala} – poszukuje ostatniego wystąpienia napisu z drugiego parametru w napisie z parametru pierwszego (dodatkowe r pochodzi od angielskiego słowa reverse – odwrotność),
- {stala}stripos{/stala} – poszukuje napisu z drugiego parametru w napisie z parametru pierwszego, ignorując wielkości liter (litera i pochodzi od case-insensitive, co oznacza niewrażliwy na wielkość znaków),
- {stala}strripos{/stala} – jest połączeniem funkcji {stala}strrpos{/stala} oraz {stala}stripos{/stala} – poszukuje ona ostatniego wystąpienia napisu z parametru drugiego w napisie z parametru pierwszego, ignorując przy tym wielkość liter.
\";
} else {
echo \"strcmp: Nie odnaleziono wyrazu \'ala\'
\";
}
$pozycja = strpos($napis, \'Ala\');
if ($pozycja !== false) {
echo \"strcmp: Odnaleziono wyraz \'Ala\' na pozycji: $pozycja
\";
} else {
echo \"strcmp: Nie odnaleziono wyrazu \'Ala\'
\";
}
$pozycja = stripos($napis, \'ala\');
if ($pozycja !== false) {
echo \"stricmp: Odnaleziono wyraz \'ala\' na pozycji: $pozycja
\";
} else {
echo \"stricmp: Nie odnaleziono wyrazu \'ala\'
\";
}
$pozycja = stripos($napis, \'Ala\');
if ($pozycja !== false) {
echo \"stricmp: Odnaleziono wyraz \'Ala\' na pozycji: $pozycja
\";
} else {
echo \"stricmp: Nie odnaleziono wyrazu \'Ala\'
\";
}
$pozycja = strrpos($napis, \'kot\');
if ($pozycja !== false) {
echo \"strrcmp: Odnaleziono wyraz \'kot\' na pozycji: $pozycja
\";
} else {
echo \"strrcmp: Nie odnaleziono wyrazu \'kot\'
\";
}
$pozycja = strrpos($napis, \'Kot\');
if ($pozycja !== false) {
echo \"strrcmp: Odnaleziono wyraz \'Kot\' na pozycji: $pozycja
\";
} else {
echo \"strrcmp: Nie odnaleziono wyrazu \'Kot\'
\";
}
$pozycja = strripos($napis, \'kot\');
if ($pozycja !== false) {
echo \"strricmp: Odnaleziono wyraz \'kot\' na pozycji: $pozycja
\";
} else {
echo \"strricmp: Nie odnaleziono wyrazu \'kot\'
\";
}
$pozycja = strripos($napis, \'Kot\');
if ($pozycja !== false) {
echo \"strricmp: Odnaleziono wyraz \'Kot\' na pozycji: $pozycja
\";
} else {
echo \"strricmp: Nie odnaleziono wyrazu \'Kot\'
\";
}
?>
Skrypt z listingu 1 powinien wypisać:
strcmp: Odnaleziono wyraz \’Ala\’ na pozycji: 15
stricmp: Odnaleziono wyraz \’ala\’ na pozycji: 15
stricmp: Odnaleziono wyraz \’Ala\’ na pozycji: 15
strrcmp: Odnaleziono wyraz \’kot\’ na pozycji: 22
strrcmp: Odnaleziono wyraz \’Kot\’ na pozycji: 29
strricmp: Odnaleziono wyraz \’kot\’ na pozycji: 29
strricmp: Odnaleziono wyraz \’Kot\’ na pozycji: 29
Zwróćmy uwagę na wielkość liter w wyrazach kot i Kot w przeszukiwanym napisie.
Wszystkie te funkcje mogą przyjmować jeszcze jeden, trzeci, opcjonalny parametr, wskazujący pozycję znaku, od którego napis z pierwszego parametru ma być przeszukiwany.
Zastępowanie fragmentów napisów
Gdy trzeba zastąpić pewien fragment napisu innym, z pomocą przychodzą funkcje {stala}str_replace{/stala} oraz {stala}str_ireplace{/stala} – działają identycznie, z tą różnicą, że {stala}str_ireplace{/stala} ignoruje wielkość liter.
Funkcje te przyjmują trzy parametry: napis, który ma być odnaleziony i zastąpiony przeszukiwanym w tekście, napis, którym napis z parametru pierwszego ma być zastąpiony, oraz tekst na którym operacja zastąpienia ma być wykonana. Funkcje zwracają w wyniku swojego działania odpowiednio zmodyfikowany napis z parametru trzeciego (listing 5).
$napis
\";
$wynik = str_replace(\'Kot\', \'kot\', $napis);
echo \"str_replace(\'Kot\', \'kot\', \$napis): $wynik
\";
?>
W wyniku działania programu otrzymamy napis:
str_replace(\’Kot\’, \’kot\’, $napis): Tekst testowy: Ala ma kota a kot ma Ale
Ciekawa wersja funkcji {stala}str_replace{/stala} jest {stala}substr_replace{/stala}. Używana jest rzadziej, jednak warto wiedzieć o jej istnieniu. Jej zadaniem jest zastąpienie fragmentu napisu określonego nie za pomocą wzorca, a poprzez podanie pozycji zastępowanego fragmentu oraz jego długości. Przyjmuje następujące parametry:
- napis, który ma zostać poddany modyfikacji,
- napis, który ma zostać umieszczony w miejsce zastępowanego fragmentu,
- pozycja znaku, od którego ma zostać wycięty fragment z napisu podanego w parametrze pierwszym,
- długość wycinanego fragmentu – parametr opcjonalny.
Jak widać, jest to połączenie funkcji {stala}substr{/stala} z funkcją {stala}str_replace{/stala} (listing 6):
$napis
\";
$wynik = substr_replace($napis, \'Janie\', -4);
echo \"substr_replace(\$napis, \'Janie\', -4): $wynik
\";
?>
W wyniku działania programu otrzymujemy napis:
substr_replace($napis, \’Janie\’, -4): Witaj Janie
Inne operacje na napisach
Poza opisanymi operacjami na napisach PHP pozwala na wiele innych operacji. Do najpopularniejszych z pozostałych funkcji nalezą:
- {stala}strlen{/stala} – przyjmuje jako parametr napis, zwraca zaś jego długość w ilości znaków,
- {stala}strtolower{/stala} – przyjmuje jako parametr napis, zwraca zaś ten sam napis, jednak zamienia wszystkie jego duże litery na małe,
- {stala}strtoupper{/stala} – działa odwrotnie do {stala}strtolower{/stala}: zamienia wszystkie małe litery napisu na duże,
- {stala}ucfirst{/stala} – przyjmuje jako parametr napis, zwraca zaś ten sam napis, zamienia jednak pierwszy jego znak na dużą literę,
- {stala}ucwords{/stala} – działa podobnie do {stala}ucfiirst{/stala}, jednak zamienia na dużą każdą pierwszą literę wszystkich wyrazów wchodzących w skład tekstu podanego jako parametr.
Bardziej złożone funkcje to także:
- {stala}strcmp{/stala} – przyjmuje jako parametry dwa napisy, które następnie porównuje. Zwraca 0, gdy oba napisy są identyczne, cyfrę mniejszą od 0, gdy pierwszy napis jest mniejszy od drugiego, bądź większą od 0, gdy pierwszy napis jest większy od drugiego.
- {stala}trim{/stala} – usuwa z początku i końca napisu niechciane znaki (domyślnie tak zwane białe znaki: spacje, tabulatory, znaki nowej linii etc). Przyjmuje od jednego do dwóch parametrów. Pierwszym parametrem jest napis, który ma zostać poddany modyfikacji, drugim zaś opcjonalna lista znaków, które mają być usuwane z początku i końca napisu (lista ta to zwykły napis z wymienionymi niechcianymi znakami, np. \’!?.,\’ oznacza, że mają być usuwane wykrzykniki, znaki zapytania kropki oraz przecinki). W wyniku działania funkcji {stala}trim{/stala} zwrócony zostaje odpowiednio zmodyfikowany napis.
Funkcja ta występuje jeszcze w dwóch wersjach – {stala}rtrim{/stala} oraz {stala}ltrim{/stala}. {stala}ltrim{/stala} usuwa znaki jedynie z lewej strony napisu (czyli z jego początku), {stala}rtrim{/stala} zaś z prawej jego strony (czyli z jego końca).
FUNKCJE STRSTR, STRISTR
Czasami potrzebna jest cześć napisu aż od wystąpienia pewnego wzorca. Wówczas pomocna może się okazać funkcja {stala}strstr{/stala}, która poszukuje pierwszego wystąpienia danego ciągu znaków w przeszukiwanym napisie, a następnie zwraca fragment przeszukiwanego napisu od odnalezionego ciągu aż do końca. Funkcja {stala}stristr{/stala} działa tak samo, ignoruje jednak wielkość liter.
Jeśli w przeszukiwanym napisie wzorzec nie zostanie odnaleziony, obie funkcje zwracając false (listing 2).
$napis
\";
$fragment = strstr($napis, \'ala\');
if ($fragment !== false) {
echo \"strstr(\$napis, \'ala\'): $fragment
\";
} else {
echo \"strstr(\$napis, \'ala\'): nie odnaleziono wyrazu \'ala\'
\";
}
$fragment = strstr($napis, \'Ala\');
if ($fragment !== false) {
echo \"strstr(\$napis, \'Ala\'): $fragment
\";
} else {
echo \"strstr(\$napis, \'Ala\'): nie odnaleziono wyrazu \'Ala\'
\";
}
$fragment = stristr($napis, \'Ala\');
if ($fragment !== false) {
echo \"stristr(\$napis, \'Ala\'): $fragment
\";
} else {
echo \"stristr(\$napis, \'Ala\'): nie odnaleziono wyrazu \'Ala\'
\";
}
$fragment = stristr($napis, \'ala\');
if ($fragment !== false) {
echo \"stristr(\$napis, \'ala\'): $fragment
\";
} else {
echo \"stristr(\$napis, \'ala\'): nie odnaleziono wyrazu \'ala\'
\";
}
?>
Wynik działania skryptu jest następujący:
strstr($napis, \’ala\’): nie odnaleziono wyrazu \’ala\’
strstr($napis, \’Ala\’): Ala ma kota a Kot ma Ale
stristr($napis, \’Ala\’): Ala ma kota a Kot ma Ale
stristr($napis, \’ala\’): Ala ma kota a Kot ma Ale
Wycinanie fragmentu napisu
Jeśli musimy wyciąć z napisu fragment rozpoczynając od konkretnej pozycji, należy skorzystać z funkcji {stala}substr(){/stala}. Przyjmuje ona od dwóch do trzech parametrów. Pierwszym parametrem jest napis, którego fragment nas interesuje. Drugim parametrem jest pozycja znaku, od której dany fragment ma być wycięty. Trzeci parametr jest opcjonalny – określa ilość znaków wchodzących w skład wycinanego fragmentu.
Gdy ostatni parametr zostaje pominięty, oznacza to, że interesuje nas fragment rozpoczynający się od pozycji podanej w parametrze drugim, aż do końca napisu z parametru pierwszego. W wyniku działania funkcja zwraca odpowiedni fragment napisu z parametru pierwszego:
Oto przykład działania funkcji (listing 3):
$napis
\";
$fragment = substr($napis, 15);
echo \"substr(\$napis, 15): $fragment
\";
$fragment = substr($napis, 15, 12); echo \"substr(\$napis, 15, 12): $fragment
\";
?>
Wynikiem działania programu jest tekst:
substr($napis, 15): Ala ma kota a Kot ma Ale
substr($napis, 15, 12): Ala ma kota
Ciekawe efekty daje użycie jako drugiego i trzeciego parametru cyfr ujemnych. W przypadku drugiego parametru cyfra ujemna oznacza od którego znaku od końca ma być wycinany napis. Jeśli cyfra ujemna określimy długość, PHP uzna, że interesuje nas tekst aż do podanego znaku od końca:
Łatwiej to zrozumieć na przykładzie (listing 4):
$napis
\";
$fragment = substr($napis, -10);
echo \"substr(\$napis, -10): $fragment
\";
$fragment = substr($napis, 15, -4);
echo \"substr(\$napis, 15, -4): $fragment
\";
?>
Wynikiem działania powyższego programu jest napis:
substr($napis, -10): Kot ma Ale
substr($napis, 15, -4): Ala ma kota a Kot ma