Certyfikat ZendPHP

Ciągi Znaków I Wzorce

Ciągi PHP to seria bajtów i nie zawierają żadnych informacji o tym, jak te bajty powinny zostać przetłumaczone na znaki. PHP przechowuje długość łańcucha wraz z jego zawartością i nie polega na znaku kończącym, oznaczającym koniec łańcucha. Pomaga to uczynić łańcuchy bezpiecznymi, ponieważ znaki puste w łańcuchu nie powodują zamieszania. W systemach 32-bitowych ciąg może być tak duży, jak 2 GB. Nie ma szczególnego limitu długości łańcucha w 64-bitowym systemie PHP.

Deklarowanie ciągów

W PHP ciągi znaków mogą być deklarowane jako typy proste lub złożone. Różnica polega na tym, że złożone łańcuchy będą oceniane w odniesieniu do znaków kontrolnych i zmiennych. Proste ciągi znaków są deklarowane w "cudzysłowie", a ciągi złożone są deklarowane w "podwójnym cudzysłowie". W tym przykładzie znak nowej linii jest wyprowadzany po Hello Bob, ale w prostym ciągu są wyprowadzane dosłowne znaki.

< ?php
$name = 'Bob';
$a = 'Hello $name\n';
$b = "Hello $name\n";
echo $a; // Hello $name\n
echo $b; // Hello Bob

Zauważ również, że zmienna $name jest oceniana jako ciąg "Bob" i jest wstawiana do zmiennej zespolonej $b, gdy jest ona wyprowadzana. Przyjrzymy się temu bardziej szczegółowo w poniższej sekcji

Osadzanie zmiennych

Jedną z głównych zalet złożonych ciągów jest to, że PHP je parsuje i automatycznie ocenia zawarte w nich nazwy zmiennych. Podczas korzystania z prostych ciągów, które nie są analizowane, należy zakończyć ciąg i połączyć z nim zmienną. Nazwy zmiennych są oznaczone przez $ w PHP. Gdy parser napotka jeden znak $ w ciągu, próbuje utworzyć nazwę zmiennej, dodając jak najwięcej znaków alfanumerycznych, aby utworzyć prawidłową nazwę zmiennej. Poniższy przykład ilustruje różnicę między konkatenacją parametrów aranżacyjnych z łańcuchami i osadzaniem ich w złożonych łańcuchach.

< ?php
$catfood = "Cheeseburgery";
echo 'Mogę mieć $catfood'; // Mogę mieć $ catfood
echo 'Mogę mieć'. $catfood; // Mogę mieć Cheeseburgery?
echo "Mogę mieć $catfood?"; // Mogę mieć Cheeseburgery?

Zauważ, że pierwszy ciąg znaków jest oznaczony pojedynczymi cudzysłowami, więc $catfood nie jest przetwarzany na zmienną. Jest raczej wyprowadzany jako dosłowne znaki. Aby uwzględnić zmienne w prostych ciągach, należy je połączyć, jak pokazuje drugi przykład. Trzecia instrukcja echo pokazuje przykład nazwy zmiennej ocenianej w złożonym ciągu. Analizator składni napotka symbol $, a następnie pobierze wszystkie następujące po nim znaki, które są zgodne z nazwą zmiennej. Symbol znaku zapytania nie jest dozwolony w nazwach zmiennych, więc PHP wstawia dosłowną wartość zmiennej $catfood do łańcucha. Możliwe jest także dołączanie składni tablicowej i obiektowej do podwójnych cudzysłowów:

< ?php
$dogfood = ['Pellets'];
$catfood = new stdClass();
$catfood->favorite = "Cheeseburger";
echo "$dogfood[0]"; // Pellets
echo "$catfood->favorite"; // Cheeseburger

PHP pozwala na użycie nawiasów klamrowych, aby wyraźnie powiedzieć parserowi, że część łańcucha musi zostać oceniona. Jest to konieczne, na przykład, podczas wyprowadzania elementu z tablicy, gdzie może nie być od razu jasne, że nawiasy kwadratowe mają służyć jako interpunkcja w łańcuchu znaków lub jako składnia w odniesieniu do elementu w tablicy. Spójrzmy na kilka przykładów jego użycia:

$burger = "Cheeseburger";
echo "Mogę mieć {$ burger}"; // Mogę mieć Cheeseburger
echo "Mogę mieć ${burger}"; // Mogę mieć Cheeseburger
echo "Mogę mieć $burgery"; // brak zmiennej $burgery
echo "Mogę mieć {$burger}y"; // Mogę mieć Cheeseburgery
echo "Mogę mieć {$burger}"; // Mogę mieć {Cheeseburger}

Zauważ, że nie możesz używać spacji między nawiasami klamrowymi a zmienną, którą chcesz ocenić. Ponieważ nawiasy klamrowe wyraźnie wskazują koniec zmiennej w ciągu, możliwe jest dołączanie znaków bezpośrednio po nich. We wcześniejszym przykładzie widzieliśmy, że "{$ burger}ys" jest renderowane jako Cheeseburgery. Spójrzmy na przykład, w którym mieszamy składnię właściwości tablicy i obiektu, aby pokazać, jak nawiasy klamrowe mogą pomóc:

< ?php
$ catfood = new stdClass();
$ catfood-> name = "Cheeseburgers";
$ cat = new stdClass ();
$ cat-> canhaz = [$ catfood];
echo "$ cat-> canhas [0] -> name"; // konwersja tablic na ciągi
echo "{$ cat-> canhas [0] -> name}"; // Cheeseburgery

Znaki Sterujące

Kiedy PHP napotka złożony ciąg, zadeklarowany w cudzysłowie, oceni go pod kątem zmiennych i znaków kontrolnych. Znaki kontrolne są oznaczone odwrotnym ukośnikiem, po którym następuje kod. Użycie odwrotnego ukośnika, po którym następuje cokolwiek innego niż znak kontrolny, spowoduje wyświetlenie odwrotnego ukośnika.

echo "Hello \ World"; // Hello \World

Strona PHP Manual na sekwencjach ucieczki1 zawiera listę znaków kontrolnych, których można użyć, ale tutaj są one w formie tabeli:

Sekwencja : Znaczenie

\n : nowa linia
\r : Powrót karetki
\t : tabulator
\v Zakładka pionowa
\e : Ucieczka
\f : Znak ASCII kończący stronę
\\ : Ukośnik wsteczny
\$ : Symbol dolara
[0-7] {1,3} Sekwencje pasujące do tego wyrażenia regularnego są w notacji ósemkowej
\x [0-9A-Fa-f] {1,2} Pasujące sekwencje są w notacji szesnastkowej
\u {{0-9a-f} {1,6}} Pasujące sekwencje są kodem Unicode, który będzie wyjściem do łańcucha, ponieważ ten kod podpisuje reprezentację UTF-8

Emoji mają punkty końcowe Unicode, więc możemy wypisać elePHPant w następujący sposób:

< ?php
echo "\ u {1F418}"; //

Oczywiście bardziej formalnym przypadkiem użycia Unicode jest internacjonalizacja (i18n).

Heredoc i Nowdoc

Heredoc to wygodny sposób na zadeklarowanie ciągu obejmującego wiele wierszy. Zamiast dodawać wiele znaków nowego wiersza, możesz zadeklarować ciąg w jednym łatwym formacie. Ciągi heredoc są oceniane pod kątem znaków kontrolnych i zmiennych, podobnie jak ciągi podwójnego cudzysłowu. Typowe zastosowania heredoc obejmują tworzenie zapytań SQL lub tworzenie sformatowanych fragmentów kodu HTML dla wiadomości e-mail lub stron internetowych. Możesz ich również użyć do zainicjowania zmiennych lub w dowolnym innym miejscu, w którym chcesz użyć ciągu obejmującego wiele wierszy. Nowdoc został wprowadzony w PHP 5.3.0 i ma na celu heredoc jakie ciągi pojedynczego cudzysłowu są ciągami podwójnie cytowanymi. Innymi słowy, nowdocs nie są oceniane pod kątem znaków specjalnych i zmiennych. Heredocs używają następującej składni:

< ?php
echo << To jest ciąg heredoc, uwaga:
1) wielkie litery znacznika
2) nazwa znacznika podlega zmiennym regułom nazewnictwa
3) gdzie jest znacznik zamykający
HEREDOC;

Uwaga: Znacznik zamykający musi zaczynać się od pierwszego znaku nowej linii.

Określ, że ciąg jest nowdoc, a nie heredoc, zawijając etykietę w pojedyncze cudzysłowy, jak poniżej:

< ? php
echo <<< 'NOWDOC'
To jest ciąg nowdoc, uwaga:
1) Pojedyncze cudzysłowy wokół etykiety
2) Zmienne nie będą oceniane
3) Znaki kontrolne nie będą oceniane
NOWDOC;

Odwoływanie się do znaków w ciągach

Możesz odwołać się do pozycji w łańcuchu, używając nawiasów kwadratowych lub nawiasów klamrowych, aby wskazać pozycję całkowitą liczoną od zera, do której chcesz się odwoływać.

< ? php
$ hello = "world";
echo $hello [0]; // w
echo $hello{1}; // o

Uwaga : Pamiętaj, że ciągi znaków są serią bajtów i odwołujesz się do pozycji bajtów. Jeśli Twój zestaw znaków zawiera więcej niż jeden bajt na znak, nie uzyskasz oczekiwanego wyniku.

W bieżącej wersji PHP wyświetli ostrzeżenie o zakresie, jeśli spróbujesz zapisać w ujemnej pozycji ciągu lub jeśli nie określisz liczby całkowitej. Zapis do pozycji, która jest poza zasięgiem spowoduje, że łańcuch zostanie wypełniony spacjami, aby pomieścić brakującą sekcję.

< ?php
$ hello = "world";
$ hello [10] = "*";
echo $hello; // world *

Zwróć uwagę na końcową gwiazdkę w poprzednim przykładzie.

PHP i ciągi wielobajtowe

PHP implementuje ciągi znaków jako tablicę bajtów z liczbą całkowitą wskazującą długość bufora (nie zakończona zerem). PHP nie przechowuje informacji o sposobie kodowania łańcucha. Schemat kodowania o zmiennej szerokości wykorzystuje kody o różnej długości do kodowania zestawu znaków. Kodowania wielobajtowe używają różnej liczby bajtów do kodowania znaków. Kodowanie wielobajtowe pozwala na zakodowanie większej liczby znaków i ich reprezentację na komputerze. Jednym ze schematów kodowania, które często spotykasz w PHP, jest UTF-8. Jest to domyślny schemat, którego PHP spróbuje użyć do kodowania wielobajtowego. Natywne funkcje łańcuchów w PHP zakładają, że łańcuchy są tablicą pojedynczych bajtów, więc funkcje takie jak substr(), strpos(), strlen() i strcmp() nie będą działać na łańcuchach wielobajtowych. Powinieneś użyć wielobajtowych odpowiedników tych funkcji, takich jak na przykład mb_substr().

Unicode

Unicode był próbą ujednolicenia wszystkich zestawów kodów reprezentujących znaki. Unicode definiuje punkty kodowe, które są abstrakcyjnymi koncepcjami znaku. Punkt kodowy Unicode reprezentuje znak i jest zapisany w następujący sposób: U + 0041. Ten numer jest przypisany do dużej litery "A". Nie ma limitu znaków, które może przechowywać Unicode. Początkowo istniało pewne zamieszanie dotyczące tego, że Unicode ma dwa bajty, ale dotyczyło to schematu kodowania, a nie samego Unicode.

Uwaga : Unicode sam nie jest systemem kodowania. Kodowanie to sposób reprezentowania znaku Unicode.

UTF-8 przechowuje wszystkie punkty kodowe od 0-127 w jednym bajcie. Obejmuje to cały zakres alfabetu angielskiego, cyfr i niektórych symboli. Punkty kodowe powyżej 127 są przechowywane w wielu bajtach (do 6 bajtów). Ponieważ punkty kodowe Unicode od 0-127 pasują do tabeli ASCII od 0-127, tekst angielski zakodowany w UTF-8 wygląda dokładnie tak samo, jakby był zakodowany w ASCII. Tylko ludzie, którzy pisali znaki z akcentami, mogliby skończyć z plikiem zakodowanym inaczej niż ASCII. Istnieją setki schematów kodowania, które mogą przechowywać niektóre punkty kodowe Unicode, ale nie wszystkie. Jeśli użyjesz jednego z tych kodowań i napotkasz znak Unicode, którego nie można przedstawić, pojawi się znak zapytania lub puste pole. Na przykład, jeśli twój schemat kodowania jest ukierunkowany na przechowywanie znaków hebrajskich i próbujesz przechowywać w nim rosyjskie znaki, otrzymasz kilka znaków zapytania zamiast rosyjskich znaków, ponieważ schemat kodowania ich nie obsługuje.

Informowanie klientów o kodowaniu łańcucha

Nie możesz z całą pewnością wykryć, w jaki sposób łańcuch został zakodowany (chyba że sam go zakodowałeś), a klienci nie mogą również zużywać twoich danych wyjściowych. O ile klient nie wie, jak kodowany jest ciąg, nie będzie w stanie wyświetlić go z pewnością. Twoim zadaniem jako programisty PHP jest informowanie klientów czytających dane wyjściowe HTML, w jaki sposób są one kodowane. Należy określić schemat kodowania znaków używany w nagłówku HTTP Content-Type. Dzięki temu klient wie, w jaki sposób kodowane są twoje dane wyjściowe, a tym samym, jak je poprawnie wyświetlić. Umieszczenie typu zawartości w HTML jako metatagu jest nieco mniej satysfakcjonujące, ponieważ jeśli klient nie zna typu kodowania, nie będzie w stanie odczytać HTML w celu ustalenia kodowania. Możesz to zrobić w ten sposób, ale lepiej tego nie robić.

Przełączanie między schematami kodowania

Rozszerzenie mbstring zapewnia szereg funkcji, których można użyć do wykrywania i konwertowania schematów kodowania. Funkcja mb_detect_encoding () przejdzie przez listę możliwych kodowań i spróbuje ustalić, w jaki sposób kodowany jest ciąg. Możesz zmienić kolejność wykrywania za pomocą funkcji mb_detect_order() lub dostarczając listę kodowań jako CSV lub tablicę. Za pomocą mb_convert_encoding () można konwertować ciąg znaków między formatami kodowania.

Praktyczny przykład

Ten przykład pokazuje niektóre aspekty zachowania się łańcuchów w PHP. Deklaruje tablicę z trzema różnymi sposobami przywitania się, a następnie uruchamia polecenia łańcuchowe na każdym z nich, aby zilustrować niektóre punkty.

< ?php
$waysToSayHello = [
'emoji' => "\u{1F44B}",
'latinchars' => "Hello",
'accentedChars' => "ça va?"
];
foreach ($waysToSayHello as $method => $string) {
echo "$method : encoding [" . mb_detect_encoding($string,
'ISO-8859-1') . '] ' .
'encoding [' . mb_detect_encoding($string, ['ASCII','UTF-8']) . '] ' .
'strlen [' . strlen($string) . '] ' .
'mb_strlen [' . mb_strlen($string) . '] ' .
'first character[' . $string[0] . ']';
echo "\r\n";
}
/*
emoji : encoding [ISO-8859-1] encoding [UTF-8] strlen [4] mb_strlen [1]

first character[? ]
latinchars : encoding [ISO-8859-1] encoding [ASCII] strlen [5] mb_strlen [5]
first character[H]
accentedChars : encoding [ISO-8859-1] encoding [UTF-8] strlen [7] mb_strlen
[6] first character[ ? ]
*/

Pamiętaj, że PHP nie przechowuje informacji o kodowaniu w ciągu, więc może tylko zgadywać, w jaki sposób kodowany jest ciąg. Funkcja mb_detect_encoding zbada ciąg znaków i spróbuje ustalić, co to jest. Odbywa się to poprzez porównanie łańcucha z listą schematów kodowania i wybranie pierwszego schematu, w ramach którego łańcuch jest prawidłowo kodowany. Możesz określić kodowanie (w kolejności), aby PHP próbowało polegać na domyślnym kodowaniu. To wyjaśnia, dlaczego dane wyjściowe z mb_detect_encoding są różne dla tego samego ciągu - dajemy PHP różne wskazówki na temat tego, co może być. Zauważ, że wynik funkcji strlen() różni się od mb_strlen. Funkcja strlen zwraca liczbę bajtów w ciągu, a nie liczbę znaków. Na koniec zauważ, że jeśli użyjemy metody notacji tablicowej, aby uzyskać dostęp do pozycji w ciągu, otrzymamy znaczący wynik, tylko jeśli ciąg jest zakodowany w formacie jednobajtowym.

Dopasowanie ciągów

Porównywanie ciągów w PHP powinno odbywać się z odpowiednim poziomem ostrożności, gdy próbujesz dopasować różne typy zmiennych. W rozdziale 1, sekcja "Rzutowanie zmiennych", przeanalizowaliśmy strony podręcznika dotyczące rzutowania. Upewnij się, że wiesz, jak PHP rzutuje różne typy zmiennych na łańcuch. Korzystanie z operatorów porównania, takich jak > i <, nie zawsze może działać zgodnie z oczekiwaniami. Często oczekuje się, że PHP użyje kolejności alfabetycznej do oceny ciągów znaków względem tych operatorów. Zamiast korzystać z sortowania alfabetycznego, PHP używa wartości ASCII znaku do porównania. Małe litery mają wyższą wartość ASCII niż wielkie litery, więc możesz mieć sytuację, w której małe litery są umieszczane po wielkich literach, tak jak tu:

< ?php
$a = "PHP";
$b = "developer";
if ($a > $b) {
echo "$a > $b";
} else {
echo "$a < $b";
}
// developer występuje przed PHP w alfabecie
// ale ten skrypt wyświetla
// PHP < developer

Przypomnij sobie zasady konwertowania ciągów na liczby całkowite omówione w rozdziale "Rzutowanie zmiennych". W poniższym przykładzie ciąg jest rzutowany na liczbę całkowitą 12, która jest równa wartości zmiennoprzecinkowej 12,00, a zatem komunikat jest powtarzany.

< ?php
$a = "12 o'clock";
$b = 12.00;
if ($a == $b) {
echo "Mysz wybiegła z zegara";
}

Jeśli nie masz pewności co do ciągów, które porównujesz, powinieneś rozważyć użycie operatora tożsamości ===, aby dokonać tego rodzaju porównania. Oprócz korzystania z operatorów PHP udostępnia również szereg funkcji porównywania ciągów. strcmp () to funkcja służąca do porównywania bezpiecznych ciągów binarnych. Jako argument przyjmuje dwa łańcuchy i zwraca <0, jeśli str1 jest mniejszy niż str2; > 0, jeśli str1 jest większy niż str2, i 0, jeśli są równe.

Wskazówka : Pamiętasz operator spaceship? Operator może być używany na dowolnym typie zmiennej, ale strcmp jest przeznaczony wyłącznie dla łańcuchów.

Istnieje również wersja bez rozróżniania wielkości liter o nazwie strcasecmp (), która najpierw konwertuje ciągi na małe, a następnie porównuje je. Ten przykład pokazuje różnicę:

< ?php
$a = "PHP";
$b = "developer";
$comparison = strcmp($a, $b);
echo $comparison . PHP_EOL; // -20
$caseInsensitive = strcasecmp($a, $b);
echo $caseInsensitive . PHP_EOL; // 12

Funkcje strncmp() i strcasencmp() mogą być używane tylko do porównywania pierwszych "n" znaków dwóch ciągów. PHP ma bardzo potężną funkcję o nazwie similar_text(), która oblicza podobieństwo między dwoma łańcuchami. Może to być bardzo kosztowna pod względem obliczeniowym procedura dla długich fragmentów tekstu, dlatego należy zachować ostrożność przed użyciem. Pamiętaj również, że kolejność przekazywania argumentów jest znacząca, więc similar_text($ a, $ b)! = similar_text ($ b, $ a). Innej funkcji, levenshtein(), można użyć do obliczenia odległości Levenshteina między dwoma łańcuchami. Odległość Levenshteina jest definiowana jako minimalna liczba znaków, które musisz zastąpić, wstawić lub usunąć, aby przekształcić str1 w str. Aby porównać podciągi, możesz użyć funkcji binarnie bezpiecznej substr_compare (). PHP ma dwie funkcje, które pozwalają pracować z dźwiękiem łańcucha. Funkcja soundex() oblicza klucz na podstawie tego, jak brzmi łańcuch. Ciągi, które brzmią tak samo, będą miały ten sam klawisz soundex. Funkcja metaphone() w podobny sposób tworzy ten sam klawisz dla podobnych ciągów dźwiękowych. Jest dokładniejszy niż soundex(), ponieważ zna podstawowe zasady angielskiej wymowy. Oczywiście może to być mało pomocne w innych językach! Istnieją dwa inne sposoby porównywania ciągów, ale zostały one omówione w rozdziale 6 dotyczącym bezpieczeństwa. Funkcja hash_equals() to bezpieczny sposób porównywania ciągów z atakiem czasowym, a password_verify() to bezpieczny sposób sprawdzania, czy hasło pasuje do skrótu. Dowiesz się o nich bardziej szczegółowo później, ale zapamiętaj je jako funkcje łańcuchowe

Wyodrębnianie ciągów

Do pojedynczej pozycji w ciągu można odwoływać się przy użyciu tej samej składni, co element tablicy. Wszystkie pozycje w ciągu są zawsze zerowane - pierwszy znak w ciągu to pozycja 0.

< ?php
$string = 'abcdef';
echo $string[0]; // a

Możesz użyć funkcji substr(), aby zwrócić część lub plasterek łańcucha. Podręcznik PHP dla substr() pokazuje składnię polecenia tak:

`string substr (string $ string, int $ start [, int $ length])`

Widać, że wymaga dwóch parametrów obowiązkowych i jednego parametru opcjonalnego. Zarówno parametry początkowe, jak i długości mogą być dodatnie lub ujemne. Jeśli wartość początkowa jest większa niż długość ciągu, substr() zwróci false. Jeśli wartość początkowa jest dodatnia (lub 0), odcinek zwróconego ciągu zaczyna się od początkowej pozycji ciągu licząc od początku. W przeciwnym razie, jeśli jest ujemny, odcinek zaczyna się w pozycji początkowej od końca łańcucha.

< ?php
echo substr("abcdef", 2) . PHP_EOL; // cdef
echo substr("abcdef", -2) . PHP_EOL; // ef

Jeśli długość zostanie pominięta, jak w poprzednim przykładzie, wycinek będzie kontynuowany od punktu początkowego wycinka do końca łańcucha. Jeśli długość jest podana jako liczba dodatnia, wówczas zwracane będą maksymalnie znaki długości. Jeśli długość jest podana jako liczba ujemna, wówczas tyle znaków zostanie pominiętych na końcu ciągu:

< ?php
echo substr ("abcdef", 0, 2). PHP_EOL; // ab
echo substr ("abcdef", 0, -2). PHP_EOL; // abcd

Jeśli podana jest długość i wynosi 0, FAŁSZ lub NULL, zwracany jest pusty ciąg znaków. To samo dzieje się, gdy parametr początkowy jest większy lub równy ciągowi. Podręcznik PHP podaje kilka innych przykładów:

< ?php
echo substr ("abcdef", 1); // bcdef
echo substr ("abcdef", 1, 3); // bcd
echo substr ("abcdef", 0, 4); // abcd
echo substr ('abcdef', 0, 8); // abcdef
echo substr ('abcdef', -1, 1); // f

Wyszukiwanie ciągów

Ponieważ PHP został napisany dla Internetu, jest szczególnie silny w przetwarzaniu ciągów. Oczekuje się, że poznasz tajniki funkcji manipulacji ciągami. W tej sekcji opisano funkcje używane do wyszukiwania ciągów. Zdecydowanie zaleca się eksperymentowanie z funkcjami i przeczytanie ich na stronach podręcznika. Egzamin Zend jest raczej nastawiony na nagradzanie doświadczenia niż na encyklopedyczną znajomość podręcznika.

Przydatne porady

Częstą skargą na PHP jest to, że trudno jest ustalić kolejność parametrów wyszukiwania ciągów i tablic. Parametry wyszukiwania PHP mają $haystack;, a my szukamy $needle. Porównaj kolejność parametrów używanych dla strpos() i array_search():

< ?php
$arr = ['a', 'b', 'c', 'd', 'e', 'f' ];
$str = 'abcdef';
echo strpos($str, 'c') . PHP_EOL;
echo array_search('c', $arr) . PHP_EOL;

Z początku wydaje się, że czasami parametr $ igła jest najważniejszy, a czasem parametr $ haystack. Jest jednak o wiele prostsze, gdy pamiętasz, że PHP korzysta z bazowych bibliotek C, a spójna reguła to:

•  W przypadku funkcji wyszukiwania ciągów kolejność to zawsze $hystack, a następnie $needle
•  W przypadku funkcji wyszukiwania tablic kolejność to zawsze $needle, a następnie $haystack

Następną przydatną wskazówką jest zapamiętanie różnicy między 0 a fałszem. Chociaż wartość logiczna fałszu jest równa 0, to jeśli rzutujesz ją na liczbę całkowitą, liczba 0 nie jest identyczna z wartością logiczną fałsz. Oto przykład, w którym najwyraźniej nie znajdujemy litery "a" w ciągu "abcdef":

< ?php
$string = 'abcdef';
if (strpos($string, 'a') == false) {
echo "False negative!" . PHP_EOL;
}

Pamiętaj, że łańcuchy są zerowe, więc pierwsza pozycja to pozycja 0. strpos() zwraca liczbę całkowitą 0, ponieważ znalazł "a" na pierwszej pozycji. Używamy operatora równości == do sprawdzania wyniku strpos (), więc fałszywie zgłaszamy, że litera "a" nie pojawia się w tym ciągu.

Wskazówka Aby obsłużyć przypadek, w którym podciąg nie został naprawdę znaleziony, powinieneś użyć operatora tożsamości ===

Szybki przegląd funkcji wyszukiwania

PHP ma kilka funkcji używanych do wyszukiwania ciągów. Zasadniczo funkcje bez rozróżniania wielkości liter mają przedrostek "i". Poniższa tabela zawiera definicje instrukcji PHP dla funkcji wyszukiwania ciągów.

Funkcja : Używana dla

substr_count() : Zwraca liczbę wystąpień podłańcucha w ciągu.
strstr() : Wyszukuje podciąg w ciągu znaków i zwraca część haystack, który pojawia się po pierwszym znalezionym wystąpieniu. Zwraca falsz, jeśli nie zostanie znalezione żadne wystąpienie. Zauważ, że użycie strpos() jest leps, ponieważ jest szybsza.
stristr(): Wersja strstr() bez rozróżniania wielkości liter.
strchr() : Zwraca część ciągu przed pierwszym wystąpieniem zmiennej needle.
strpos() Zwraca pozycję pierwszego wystąpienia needle
stripos() : Wersja strpos() bez rozróżniania wielkości liter.
strspn() : Znajduje długość początkowego segmentu łańcucha składającego się całkowicie ze znaków zawartych w danej masce
strcspn() : Zwraca długość początkowego segmentu podmiotu, który to robi i nie może zawierać żadnych znaków w masce. Innymi słowy, wyszukuje pierwsze wystąpienie dowolnej litery maski w ciągu i zwraca liczbę znaków, które istnieją przed nim.

Zastępowanie ciągów

PHP ma trzy funkcje zastępowania ciągów. str_replace() i jego wersja bez rozróżniania wielkości liter str_ireplace() mogą być używane do podstawowych zamian

< ?php echo str_replace('foo', 'bar', 'Delicious food');

Obie przyjmują trzy obowiązkowe parametry - ciąg wyszukiwania, ciąg zastępujący i ciąg, na którym mają działać. Jeśli przekażesz opcjonalną czwartą zmienną (jest to argument referencyjny), zostanie ona ustawiona na liczbę zamienników wykonanych przez PHP. Zarówno parametry wyszukiwania, jak i zastępcze mogą być tablicami. Pozwala to zastąpić wiele wartości w jednym wywołaniu, jak w tym przykładzie:

< ?php
$string = "I like black hot coffee";
$search = ['black', 'coffee'];
$replace = ['green', 'tea'];
echo str_replace($search, $replace, $string); //Lubię zieloną gorącą herbatę

Możesz użyć funkcji substr_replace(), aby zastąpić podciągi. substr_replace() zastępuje kopię ciągu ograniczonego parametrami początkowymi i (opcjonalnie) ciągiem podanym w zastępstwie. strtr() to kolejna funkcja zastępująca podciągi i znaki. Jeśli podano tylko dwa parametry, drugim parametrem powinna być tablica par zastępczych. W przeciwnym razie pobiera trzy parametry, ponieważ w tym przykładzie z podręcznika PHP jest on używany do konwersji znaków ze znakami akcentu na znaki w formacie angielskim:

$ address = "09479 Huopainenkylä, Pöhjois-Karjala";
$ address = strtr ($ address, "ä?ö", "aao");
echo $ adres; // 09479 Huopainenkyloa, Pohjois-Karjala

Najbardziej elastycznym i wydajnym sposobem zamiany napisów jest użycie funkcji preg_match(), która pozwala na użycie wyrażeń regularnych do znalezienia wycinków ciągu do zamiany.

Formatowanie ciągów

Funkcja printf() służy do wyświetlania sformatowanego ciągu. Powinieneś przeczytać uważnie instrukcję PHP7 i upewnić się, że ćwiczyłeś korzystanie z niej. Ogólnym zastosowaniem jest określenie ciągu formatującego i wartości, które należy w nim umieścić.

< ?php
$minutes = 60;
$timeUnit = "an hour";
printf("There are %u minutes in %s.", $minutes, $timeUnit);

W tym przykładzie zauważysz, że pierwszy parametr printf() ma dwa symbole zastępcze oznaczone symbolami procentowymi. Następujące parametry to wartości, które muszą być rzutami typu i wstawione do tych symboli zastępczych. Istnieje wiele symboli, których można użyć do sformatowania parametrów. Znajdziesz tę listę na stronie internetowej PHP 8, ale dla Twojej wygody zamieszczam ją tutaj:

Symbolu : Format

%% : Dosłowny znak procentu. Nie jest wymagany żaden argument.
%b : Argument jest traktowany jako liczba całkowita i prezentowany jako liczba binarna.
%c : Argument jest traktowany jako liczba całkowita i prezentowany jako znak z tą wartością ASCII.
%d : Argument jest traktowany jako liczba całkowita i prezentowany jako (ze znakiem) liczba dziesiętna.
%e : Argument jest traktowany jako notacja naukowa (np. 1,2e + 2). Precyzja specyfikator oznacza liczbę cyfr po przecinku od PHP 5.2.1. We wcześniejszych wersjach była przyjmowana jako liczba znaczących cyfr (jeden mniej).
%E : Podobnie jak %e, ale używa dużej litery (np. 1,2E + 2).
%f : Argument jest traktowany jako zmiennoprzecinkowy i przedstawiany jako zmiennoprzecinkowa liczba (zależna od ustawień regionalnych).
%F : Argument jest traktowany jako zmiennoprzecinkowy i przedstawiany jako zmiennoprzecinkowa liczba (nieobsługujący ustawień regionalnych). Dostępne od PHP 4.3.10 i PHP 5.0.3.
%g : Krótszy od% e i% f.
%G : Krótszy od% E i% f.
%o ; Argument jest traktowany jako liczba całkowita i prezentowany jako liczba ósemkowa.
%s : Argument jest traktowany i prezentowany jako ciąg.
%u : Argument jest traktowany jako liczba całkowita i prezentowany jako liczba dziesiętna bez znaku
%x : Argument jest traktowany jako liczba całkowita i prezentowany jako szesnastkowa liczba (małymi literami).
%X : Argument jest traktowany jako liczba całkowita i prezentowany jako szesnastkowa liczba (z dużymi literami).

Formaty PHP są zależne od ustawień regionalnych, co wpływa na to, jak reprezentują liczby i daty. Na przykład, jeśli ustawisz ustawienia regionalne na niderlandzki, wówczas data będzie podawana w języku niderlandzkim. Jest to pokazane w przykładzie w podręczniku PHP:

< ?php
// Ustaw język na holenderski
setlocale(LC_ALL, 'nl_NL');
// Output: vrijdag 22 december 1978
echo strftime("%A %e %B %Y", mktime(0, 0, 0, 12, 22, 1978));

Uwaga Informacje regionalne są przechowywane dla poszczególnych procesów, a nie wątków.

Jeśli korzystasz z PHP na wielowątkowym interfejsie API serwera, takim jak IIS, HHVM lub Apache w systemie Windows, możesz doświadczyć nagłych zmian ustawień regionalnych podczas działania skryptu, chociaż sam skrypt nigdy nie nazywa się setlocale(). Dzieje się tak, ponieważ inne skrypty działają jednocześnie w różnych wątkach tego samego procesu, zmieniając ustawienia narodowe całego procesu za pomocą setlocale(). W systemie POSIX można użyć ustawień regionalnych polecenia powłoki -a, aby wyświetlić listę wszystkich obsługiwanych ustawień narodowych. Na komputerach z systemem Windows w MSDN znajdują się strony z listą regionów, które można wyświetlić w panelu sterowania

Formatowanie liczb

Funkcja number_format() to prosty sposób formatowania liczb. number_format() nie rozpoznaje ustawień regionalnych, więc nie wybierze automatycznie znaków separatora. Domyślnie separator tysięcy jest przecinkiem i nie są wyświetlane miejsca dziesiętne. Ta funkcja pobiera parametry do sformatowania liczby, liczby miejsc dziesiętnych do wyświetlenia, znaku kropki dziesiętnej i znaku separatora tysięcy. Do funkcji można przekazać jeden, dwa lub cztery parametry. Oto przykład:

< ?php
$number = 1234.5678;
// 1,235
echo number_format($number) . PHP_EOL;
// 1,234.568
echo number_format($number, 3) . PHP_EOL;
// 1.234,57
echo number_format($number, 2, ',', '.') . PHP_EOL;

Aby sformatować walutę, możesz użyć funkcji money_format (). Jest rozpoznawany przez ustawienia regionalne i wykorzystuje informacje ustawione przez system hosta.

< ?php
// Ustawienia regionalne to angielski brytyjski
setlocale(LC_MONETARY, 'en_GB');
echo money_format('%.2n', "5000000.123");
// Ustawienia regionalne to Dania
setlocale(LC_MONETARY, 'da_DK');
echo money_format('%.2n', "5000000.123");

Dane wyjściowe wyglądają następująco:

5 000 000 ? 12
5.000.000,12 kr

Wzory ciągów: wyrażenia regularne

Wyrażenia regularne to zestaw reguł, do których dopasowujesz ciągi. Reguły są zapisywane jako ciąg znaków w formacie opisującym szukany wzorzec. Istnieje kilka smaków wyrażeń regularnych; PHP używa wyrażeń regularnych zgodnych z Perl (PCRE). Ucząc się wyrażeń regularnych, powinieneś znaleźć tester wyrażeń regularnych online, który Ci się podoba. Istnieje kilka do wyboru, dzięki czemu gra z wyrażeniami jest o wiele szybsza i pozwala sprawdzić, jak pasują do siebie.

Ograniczniki

Wyrażenia regularne są rozdzielane znakami, które pojawiają się na początku i na końcu każdego wzorca w twoim wyrażeniu. Zwykle używa się ukośnika, ale # i ! są również powszechne. Można użyć dowolnego znaku, ale separator będzie wymagał zmiany znaczenia w wyrażeniach, więc standardem jest wybór separatora, który prawdopodobnie nie będzie występował w wyszukiwanym wyrażeniu. Na przykład, jeśli będziesz przeszukiwać katalogi w celu znalezienia tych, które pasują do wzorca, znak ukośnika do przodu może nie być najlepszym wyborem separatora.

Meta-Znaki

Meta-znaki są interpretowane jako mające znaczenie we wzorcu wyszukiwania. Trzeba je uciec, jeśli zamierzasz je traktować dosłownie. Są one wymienione w poniższej tabeli.

Znak : Znaczenie

\ : Ogólna postać ucieczki
^ : Początek tematu lub linii
$ : Koniec tematu lub wiersza
. : Dopasuj dowolny znak oprócz nowej linii
[ : Zacznij definiować klasę znaków
] : Koniec definiowania klasy znaków
| : Początek alternatywnej gałęzi (np. "Lub")
( : Początek pod-wzoru
) : Koniec pod-wzoru
? : Zero lub jeden kwantyfikator
* : Zero lub więcej kwantyfikatora
+ : Jeden lub więcej kwantyfikatorów
{ : Rozpocznij kwantyfikator min / maks
} : Koniec kwantyfikatora min / maks

Będziemy na tym opierać się podczas pracy, ale na razie pamiętaj, że te symbole mają określone znaczenie w wyrażeniu regularnym lub wzorze. Musisz się z nimi zapoznać przed przystąpieniem do egzaminu.

Ogólne typy znaków

Regex oferuje sposób, aby określić, że znak w ciągu wyszukiwania może być dowolnego określonego typu. Podajesz je za pomocą meta-znaku odwrotnego ukośnika (Escape), a następnie podając literę typu. W poniższej tabeli wymieniono typy znaków dostępne w PCRE.

Symbol : Rodzaj znaku

\d : Każda cyfra dziesiętna
\h : Dowolny poziomy biały znak
\s : Dowolny biały znak
\v : Dowolny pionowy znak spacji
\w : Dowolny znak "słowo"
\D :Dowolny znak, który nie jest cyfrą dziesiętną
\H : Dowolny znak, który nie jest poziomą białą spacją
\S : Dowolny znak, który nie jest spacją
\V : Dowolny znak, który nie jest pionowym znakiem spacji
\W : Dowolny znak "inny niż słowo"

Od razu powinieneś zauważyć, że symbol wielkiej litery jest odwrotnością symbolu małej litery. Znak "słowo" to dowolna litera, cyfra lub znak podkreślenia. Rzeczywiste znaki zawarte w tym są zależne od ustawień regionalnych.

Granice

Granica słowa to pozycja w ciągu, w której bieżący znak i poprzedni znak nie pasują zarówno do \w, jak i do \W. Innymi słowy, jest to pozycja w ciągu, w której słowo zaczyna się lub kończy, lub pozycja, w której jeden ze znaków pasuje do \w, a drugi do \W.

Symbol : Granica

\b : Granica słowa
\B : Brak granicy słowa
\A : Początek tematu
\Z : Koniec tematu lub nowej linii na końcu
\z : Koniec tematu
\G : Pierwsza pasująca pozycja w temacie

Klasy znaków

Klasy znaków są bardzo elastycznymi sposobami definiowania, jaki zestaw znaków w ciągu wyszukiwania można dopasować. Określając małą sekwencję znaków we wzorcu, możesz dopasować znacznie większy zestaw znaków w wyszukiwanym ciągu. W tabeli meta-znaków zobaczyłeś, że tworzysz klasę znaków, umieszczając ją w nawiasach kwadratowych. Przykładem klasy znaków jest [A-Z], która oznacza wszystkie litery wielkimi literami. Możesz także użyć wszystkich typów ogólnych w klasach postaci, więc [A-Z \ d] dopasuje wszystkie wielkie litery oraz cyfry.

Dopasowywanie więcej niż raz

Wyrażenie / [A-Z \ d] / zastosowane do ciągu "abc123ABCabc" będzie pasować do znaku "1". Innymi słowy, pasuje do pierwszego wystąpienia w ciągu wyszukiwania znaku, który pasuje do wyrażenia. Jeśli odwołujesz się z powrotem do tabeli dotyczącej metaznaków, możesz zobaczyć, że symbol + może być użyty do określenia, że chcesz mieć jeden lub więcej wzorca. Zatem wyrażenie / [A-Z \ d] + / zastosowane do ciągu "abc123ABCabc" będzie pasowało do znaków "123ABC". Możesz użyć nawiasów klamrowych, aby ograniczyć liczbę dopasowań. Składnia najlepiej wyświetla się w tabeli, w której dopasowuje się wyrażenie do ciągu "abc123ABCabc":

Wyrażenie : Ograniczenie : Wyjście

/ [A-Z \ d] + / : Jeden lub nieograniczone : 123ABC
[A-Z \ d] {3} : Dokładnie trzy : 123
[A-Z \ d] {3,} ; Trzy lub więcej : 123ABC
[A-Z \ d] {3,5} : Od trzech do pięciu : 123AB
[A-Z \ d] {50} : Dokładnie 50 : Brak dopasowania

Przechwytywanie grup

Grupy przechwytywania są oznaczone nawiasami kwadratowymi i umożliwiają zastosowanie kwantyfikatora do grupy. Tworzą również ponumerowane grupy, które przechowują dopasowaną wartość, i można się do nich odwoływać w innym miejscu wyrażenia. W tym przykładzie tworzymy grupę przechwytywania wokół słowa "cheeseburger" i używamy tej grupy, aby określić, że zero lub jeden z nich zostanie dopasowany.

< ?php
$subject = "I can haz Cheeseburgers";
$pattern = "/I can haz (Cheeseburger)?/";
$matches = [];
preg_match($pattern, $subject, $matches);
var_dump($matches[0]);

Daje to string (22) "I can haz Cheeseburger". Zauważ, że "s" na końcu łańcucha nie jest dopasowany.

Wskazówka W ramach ćwiczenia zagraj wyrażeniem regularnym w swoim ulubionym edytorze i zobacz, co się stanie, jeśli użyjesz tematu "Mogę mieć" (bez spacji na końcu łańcucha).

Aby zoptymalizować zapytanie, możesz użyć grup nie przechwytujących. Powinieneś ich użyć, gdy nie musisz przechwytywać dopasowania. Są one oznaczone poprzez umieszczenie znaku ?: . na początku grupy. Poprzedni przykład został napisany jako / I can haz (?: Cheeseburger)? /. Pamiętaj, że to wyrażenie nadal zwróci ciąg znaków do PHP, ale po prostu nie zapisze łańcucha Cheeseburger jako grupy dla wyrażenia, do którego można się odwoływać. Może wydawać się mylące, że ? jest kwantyfikatorem, a także oznacza grupę nie przechwytującą. Pamiętaj tylko, że kwantyfikator nie może wystąpić na początku grupy, ponieważ nie ma nic do kwantyfikacji.

Chciwość i lenistwo

Domyślnie dopasowanie jest "zachłanne" i będzie pasować jak tylko to możliwe do ciągu. Rozważ przykład, z którym będziesz pracować. Wyobraź sobie, że chcesz dopasować znacnziki HTML, więc spróbuj wykonać następujące czynności:

< ?php
$subject = "Some < strong >html< /strong > text";
$pattern = "/<.*>/";
$matches = [];
preg_match($pattern, $subject, $matches);
var_dump($matches[0]); // string(21) "< strong >html< /strong >"

Daje to string(21) "< strong > html < /strong >", który daje wyraźnie więcej niż pożądany znaczniki HTML.

Winna jest za to chciwość; kwantyfikator * jest zachłanny i próbuje znaleźć jak najdłuższe dopasowanie. Zwraca znaki między otwierającym znacznikiem < strong a ostatnim znacznikiem zamykającym > , co jest najdłuższym możliwym dopasowaniem. Natomiast leniwe wyszukiwanie zwraca możliwie najkrótsze dopasowanie. Możesz zmodyfikować kwantyfikator, aby był leniwy, dodając do niego znak zapytania (?).

< ?php
$subject = "Some < strong >html< /strong > text";
$pattern = "/<.*?>/"; // note the pattern has changed
$matches = [];
preg_match($pattern, $subject, $matches);
var_dump($matches[0]); // string(8) "< strong >"

Istnieje wiele innych opcji modyfikacji kwantyfikatorów

Uzyskiwanie wszystkich dopasowań

Do tej pory wyrażenia zwracają tylko pierwsze wystąpienie pasującej części ciągu wyszukiwania. Powiedzmy, że chcesz znaleźć wszystkie dopasowania w ciągu. PCRE ma globalny modyfikator, ale PHP używa osobnej funkcji o nazwie preg_match_all(), aby zwrócić wszystkie dopasowania.

< ?php
$subject = "Some < strong >html< /strong > text";
$pattern = "/<.*?>/";
$matches = [];
preg_match_all($pattern, $subject, $matches);
var_dump($matches);
/*
array(1) {
[0] =>
array(2) {
[0] => string(8) "< strong >"
[1] => string(9) "< /strong >"
}
}
*/

Grupy nazw
na początku nawiasu otwierającego grupę. Na przykład:

< ?php
$subject = "test@example.com";
$pattern = "/^(?< username >\w+)@(?< domain >\w+).(?< tld >\w+)/";
$matches = [];
if (preg_match($pattern, $subject, $matches)) {
var_dump($matches);
}

W tym przykładzie nazywamy pierwszą część pasującego wzorca nazwą użytkownika, następną domeną, a następną tld. Jest to dość naiwny przykład, ponieważ nie działa na adresy e-mail, takie jak test@example.co.uk, ale służy do pokazania składni. Poprzedni przykład wyprowadza to:

array(7) {
[0] => string(16) "test@example.com"
'username' => string(4) "test"
[1] => string(4) "test"
'domain' => string(7) "example"
[2] => string(7) "example"
'tld' => string(3) "com"
[3] => string(3) "com"
}

Możesz więc odwołać się do $matches ['username'] i otrzymać w odpowiedzi "test", co jest wygodne.

Modyfikatory wzorców

Możesz dodać modyfikator po ograniczniku zamykającym wyrażenie. Poniższe tabele zawierają modyfikatory.

Modyfikator : Funkcja

i : W wyrażeniu nie jest rozróżniana wielkość liter.
m : Tryb wielowierszowy. Ciągi mogą obejmować wiele linii a znaki nowej linii są ignorowane. Zamiast dopasowywać początek i koniec łańcucha, symbole ^ i $ będą pasować do początku i końca linii.
s : meta-znak .będzie również pasował do nowych linii.
x : Zignoruj białe znaki, chyba że ich unikniesz.
e : To powoduje, że kod PHP jest oceniany i jest wysoce odradzany. To jest przestarzałe od PHP 5.5 i PHP 7 wygeneruje ostrzeżenie, ponieważ nie jest już obsługiwane.
U : To sprawia, że kwantyfikatory są domyślnie leniwe i używają? zamiast oznaczeni ich jako chciwych.
u : To mówi PHP, aby traktował wzorzec i łańcuch jako kodowane w UTF-8. Oznacza to, że znaki zamiast bajtów są dopasowane.


QUIZ



P1: Nie można porównać zmiennej łańcuchowej ze zmienną całkowitą, używając operatorów większych lub mniejszych niż. Można porównywać tylko ciąg i wartości całkowite z operatorem równoważności.

---------------------
Prawdziwe
Fałszywy

P2: Możesz użyć funkcji ________, aby dokonać binarnie bezpiecznych porównań ciągów bez rozróżniania wielkości liter.

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

strcmp
strcasecmp
stricmp

P3: Funkcje PHP przeszukujące ciągi ZAWSZE mają parametry w określonej kolejności.

---------------------
$haystack, $needle
$needle, $haystack
To zależy od funkcji

P4: Do czego służy funkcja strspn ($subject, $mask)?

---------------------
Przeszukuje ciąg $subject w poszukiwaniu podciągu $mask
Zwraca maksymalną długość łańcucha w $subject, który zawiera tylko litery zawarte w $ mask
Zwraca minimalną długość łańcucha w $subject, który zawiera wszystkie litery zawarte w $ mask
Jest to binarnie bezpieczny sposób na podzielenie ciągu określonego przez $ mask na ciąg $ podmiot

P5: Do czego służy funkcja strstr ($haystack, $needle)?

---------------------
Jest to szybsza alternatywa dla strpos()
Jest to binarnie bezpieczna alternatywa dla strpos()
Zwraca część $haystack, która występuje po pierwszym wystąpieniu $needle
Zwraca pozycję w $haystack, w której po raz pierwszy pojawia się $needle

P6: Jakie są wyniki tego kodu?

< ?php
$ fact = "Psy robią tylko sen";
$ fact = strtr ($ fact, "Dog", "Cat");
echo $ fakt;

---------------------
0
Koty robią tylko sen
Cats da nathint but sleep
To generuje błąd

P7: Które z tych wyrażeń regularnych zidentyfikuje oba adresy e-mail (i tylko adresy e-mail) w następującym tekście. Wybierz tyle, ile dotyczy. "Przewróć choinkę na ścianę kittens@catsaregreat.com, baw się jedzeniem i daj się zwieść kurzowi lub złap siamese@catsaregreat.com dziś czerwoną kropką, aby dziś złapać czerwoną kropkę.".

---------------------
[a-z] *. [a-z.] +
\ b [a-z] + @ [a-z] +. com \ b
\ b [a-z] + @ [a-z.] + \ b
(\ b [a-z] * @ \ b) ([a-zA-Z \ d] +)
(\ S *) @ (\ w *). (\ S *)

P8: Jakie są wyniki tego kodu?

echo substr ("abcdefgh12345678");

---------------------
abcdefgh12345678
Nic
Ostrzeżenie
Błąd krytyczny

P9: Która z poniższych funkcji służy do funkcji preg_replace_callback ()?

---------------------
Użyj funkcji zwrotnej, aby podać ciąg zastępujący zamiast ciągu statycznego
Użyj funkcji zwrotnej, która zwraca listę dopasowań do zastąpienia
Określ funkcję, która ma być wywoływana po zakończeniu działania preg_replace ()
Nie ma takiej funkcji


ODPOWIEDZI



• Fałszywy

• strcasecmp

• $haystack, $needle

• Zwraca maksymalną długość łańcucha w $subject, który zawiera tylko litery zawarte w $mask

• Zwraca część $haystack, która występuje po pierwszym wystąpieniu $needle

• Cats da nathint but sleep

• \ b [a-z] + @ [a-z] +. com \ b ; \ b [a-z] + @ [a-z.] + \ b ; (\ b [a-z] * @ \ b) ([a-zA-Z \ d] +); (\ S *) @ (\ w *). (\ S *)

• Ostrzeżenie

• Użyj funkcji zwrotnej, aby podać ciąg zastępujący zamiast ciągu statycznego