PHP to obecnie jeden z najpopularniejszych języków do wdrażania aplikacji internetowych. Ten kurs koncentruje się na nauce jego podstaw. Nacisk kładziony jest na praktyczne użycie nabyte umiejętności.

Język PHP powstał w celu rozwiązania konkretnego problemu praktycznego w środowisku internetowym (o czym można się przekonać po przeczytaniu pierwszego wykładu kursu). Postaramy się też nie rozpraszać zbytnio rozważaniami teoretycznymi, a w każdym z wykładów postaramy się rozwiązać konkretny problem. Większość przykładów pochodzi z prawdziwych istniejący system: Wirtualne Muzeum Historii Informatyki. Pierwsza część kursu poświęcona jest nauce podstaw składni i struktur kontrolnych. Następnie technologia klient-serwer jest uważana za główny obszar zastosowania języka PHP. Następnie przechodzimy do badania najbardziej przydatnych naszym zdaniem funkcji wbudowanych i rozwiązywania praktycznych problemów za ich pomocą. Chociaż model obiektowy w język PHP nie najbogatszy, jego fundamentalna obecność pozwala w naturalny sposób opisać modele obiektów dane. Jako model podstawowy rozważony zostanie model dokumentu wirtualnego muzeum informatyki. Następnie rozważonych zostanie szereg zastosowanych aspektów: praca z system plików, z bazą danych, stringami, sesjami, DOM XML - wszystko to pozwoli nam zastanowić się nad kluczowymi zadaniami praktycznego wykorzystania języka.

Książka:

Korzystanie z szablonów w PHP

Korzystanie z szablonów w PHP

Czym są szablony i dlaczego są potrzebne?

Czym jest wzorzec w języku programowania? Można powiedzieć, że szablon to tekst zawierający zmienne wewnątrz. Gdy szablon jest przetwarzany, zmienne są zastępowane ich wartościami.

W jednym z wykładów rozważaliśmy już przykład szablonu. Był to szablon do wyświetlania dokumentów. Użytkownik utworzył wiersz tekstu oznaczony tagami html i wstawił do niego specjalne metaznaki (w postaci), które następnie nasz program zastąpił wartościami odpowiednich elementów. Dlaczego potrzebujemy takiego szablonu? Dzięki temu możesz na przykład zmienić styl wyświetlania dokumentu bez zmiany kodu programu.

Najczęstsza odpowiedź na pytanie, dlaczego potrzebne są szablony, brzmi mniej więcej tak: szablony są potrzebne, aby oddzielić logikę aplikacji od sposobu prezentacji danych, czyli od projektu.

Podany przykład szablonu jest jednym z najprostszych. Do jego przetworzenia używana jest tylko funkcja podstawiania str_replace(). Najczęściej do pracy z szablonami tworzone są biblioteki klas. W zasadzie nie jest konieczne tworzenie własnej biblioteki, ponieważ istnieje wiele swobodnie dystrybuowanych bibliotek szablonów, nad których funkcjonalnością pracują duże zespoły programistów, starając się, aby były uniwersalne, wydajne i szybkie. Rozważymy niektóre z tych bibliotek. Ale najpierw sformułujmy problem, na przykładzie którego rozwiązania zademonstrujemy użycie różnych szablonów.

Zadaniem więc jest:

Wymagane jest wygenerowanie strony internetowej z listą artykułów dostępnych w bazie danych. Dla uproszczenia zakładamy, że artykuł posiada tytuł, autora, streszczenie streszczenia oraz treść pełnotekstową, która jest prezentowana jako tekst w bazie danych lub jako link do pliku. Lista powinna być tak zorganizowana, aby po kliknięciu tytułu artykułu jego pełna treść pojawiła się w nowym oknie.

Wzory substytucji

Jak taki problem można rozwiązać za pomocą prostej metody substytucji, tj. w jaki sposób rozwiązaliśmy problem wyświetlania dokumentów?

Musisz wymyślić szablon dla tej strony i przechowywać go gdzieś (w pliku lub w bazie danych). Oczywiście nie możemy wymyślić szablonu dla całej strony, ponieważ nie wiemy, ile artykułów znajduje się w bazie danych. W szablonie zgodziliśmy się używać tylko html i metaznaków. Dlatego możemy napisać szablon tylko dla jednego wiersza listy, który już trzeba programowo przekonwertować na wymaganą liczbę wierszy.

  • "
    cel=nowy>
    ()

    Dodatkowo jest tu jeszcze jeden szkopuł – z wyświetleniem linku do pełnego tekstu artykułu. Jeśli postępujemy zgodnie z regułą podstawiania (zmieniamy wszystkie metaznaki na ich wartości z bazy), to może się okazać, że zamiastwstawiaj nie link do tekstu, ale sam tekst. Oznacza to, że element ten wymaga dodatkowego sprawdzenia przed zastąpieniem i wykonania dodatkowych czynności, jeśli pole pełnotekstowe zawiera tekst artykułu, a nie link do pliku. Nie komplikujmy sobie życia i zgódźmy się, że pole pełnotekstowe zawsze zawiera tylko link do pliku. Wtedy problem można rozwiązać w następujący sposób:

    $li_tmpl = file_get_contents("tmpl.html");
    // odczytaj wzór linii z pliku
    // nawiąż połączenie i wybierz
    // Baza danych
    $conn = mysql_connect("host lokalny",
    "nina","123")
    or die("Nie można się połączyć");
    mysql_select_db("książka");
    $sql = "WYBIERZ * Z artykułów";
    $q = mysql_query($sql,$conn);
    // wysłać prośbę
    $liczba = mysql_num_rows($q);
    dla($i=0; $i<$num; $i++){
    $tmpl .= $li_tmpl;
    $tmpl = str_replace("",
    mysql_result($q,$i,"tytuł"),$tmpl);
    $tmpl = str_replace("",
    mysql_result($q,$i,"autor"),$tmpl);
    $tmpl = str_replace("",
    mysql_result($q,$i,"abstrakt"),$tmpl);
    $tmpl = str_replace("",
    mysql_result($q,$i,"pełny tekst"),$tmpl);
    }
    echo $tmpl;
    ?>

    Jeśli szablon był taki sam jak powyżej, otrzymujemy coś takiego.

    Wprowadzenie do PHP(Saveleva N.V.)

    Wykład daje wyobrażenie o tym, czym jest język PHP, dlaczego został pierwotnie stworzony i jak jest teraz używany, jakie posiada funkcje.

    Instalacja i konfiguracja oprogramowania (Iwanow Iwan)

    W zasadzie metoda jest dość prosta i wygodna, ale wymaga dodatkowego wysiłku programisty, gdy pojawiają się problemy bardziej złożone niż proste podstawianie wartości. Aby rozwiązać problemy, w których musisz dokonać zamiany całych bloków lub nawet sprawdzić warunki, utwórz klasy szablonów, takie jak FastTemplate i Smarty. Omówmy je bardziej szczegółowo.

    Szablony

    FastTemplate to zestaw klas, które umożliwiają pracę z szablonami. Logiki nie można dodać do szablonu FastTemplate, wszystko musi znajdować się w kodzie programu. Idea działania szablonów FastTemplate polega na tym, że każda duża strona składa się z wielu części, z których najmniejsze są regularne struny tekst i otrzymują nazwę i wartość.

    Co to jest plik szablonu FastTemplate? Jest to zwykły plik html, który może zawierać zmienne specjalnego typu, które są następnie przetwarzane przez metody klasy FastTemplate.

    Składnia zmiennych w szablonach FastTemplate jest opisana następującym wyrażeniem: ((+))

    Oznacza to, że zmienna musi zaczynać się nawiasem klamrowym „(”. Drugi i kolejne znaki muszą być wielkimi literami od A do Z, cyframi lub podkreśleniami. Zmienna jest oceniana za pomocą zamykającego nawiasu klamrowego „)”.

    (TYTUŁ)
    (AUTH20)
    (NA GÓRZE STRONY)

    Jak już wspomniano, główną ideą FastTemplate jest stworzenie strony za pomocą zagnieżdżonych szablonów. Na przykład, aby rozwiązać nasz problem, możemy stworzyć trzy pliki szablonów:


    (TYTUŁ_)


    (Główny)



      (LIST_ELEMENT)

  • (TYTUŁ)
    ((AUTOR))

    (ABSTRAKCYJNY)

    Stworzyliśmy szablony - praca projektanta została wykonana. Teraz musisz nauczyć się je przetwarzać, tj. wykonywać pracę programisty. Teraz stwórzmy program do przetwarzania powyższych szablonów.

    Zanim zaczniemy pracować z szablonami FastTemplate, musimy połączyć ten zestaw klas z naszym programem. W rzeczywistości zestaw klas FastTemplate jest zapisany w jednym pliku, zwykle nazywanym class.FastTemplate.php3, więc można go dołączyć np. za pomocą polecenia:

    include("klasa.FastTemplate.php3");

    Kolejnym ważnym krokiem jest utworzenie obiektu klasy FastTemplate, z którym będziemy pracować później:

    $tpl = nowy FastTemplate(
    "/ścieżka/do/szablonów");

    Ścieżka do miejsca, w którym znajdują się nasze szablony, jest przekazywana jako parametr.

    Aby pracować z FastTemplate, musisz znać cztery główne metody: definiować, przypisywać, analizować i FastPrint.

    zdefiniuj metodę

    Składnia:

    define(tablica (klucz => wartość,
    klucz1 => wartość1, ...))

    Metoda define() kojarzy nazwę pliku szablonu z krótszą nazwą, której można użyć w programie. Oznacza to, że „klucz” to nazwa, której użyjemy w programie, aby odwołać się do pliku szablonu, którego nazwa jest zapisana w wierszu „wartość”. Nie zaleca się używania prawdziwych nazw plików szablonów nigdzie poza metodą define. Po wywołaniu metody define() ładowane są wszystkie zdefiniowane w niej szablony.

    $tpl->define(tablica (główna => "główna.tpl",
    list_f => "lista.tpl",
    list_el => "element_listy.tpl"));

    W tym miejscu aliasujemy nazwy plików szablonów. Te aliasy, tj. zmienne main, list_f i list_el zostaną użyte w programie zamiast odpowiednich nazw plików main.tpl, list.tpl i list_element.tpl.

    przypisz metodę

    Składnia:

    przypisz((pary klucz/wartość) lub
    (tablica(pary klucz/wartość))

    Metoda assign() przypisuje wartości zmiennych, „klucz” to nazwa zmiennej, a „wartość” to wartość, która ma być do niej przypisana. Aby zmienna w szablonie została zastąpiona wartością, ta wartość musi być do niej przypisana za pomocą metody assign(). Zgodnie ze składnią metoda ta może być używana w dwóch różnych formach. W FastTemplate istnieje tylko jedna tablica, więc jeśli ponownie ustawisz wartość na ten sam klucz, zostanie ona nadpisana.

    $tpl->przypisz(tablica(
    TITLE => "Instalacja i konfiguracja oprogramowania",
    TITLE => "Wprowadzenie do PHP"));

    Tutaj ustawiamy dwukrotnie wartość zmiennej dostępnej w plikach szablonów o nazwie TITLE. Ta zmienna będzie miała przypisaną ostatnią wartość, tj. jest równy łańcuchowi "Wprowadzenie do PHP".

    metoda analizy

    Składnia:

    parsować (zmienna zwracana,
    źródła szablonów)

    Metoda parse() jest najbardziej podstawową w FastTemplate. Ustawia wartość zwracanej zmiennej na przeanalizowane szablony z określonych źródeł. Metodę można stosować w trzech formach: prostej, złożonej i łączącej.

    $tpl->parse(GŁÓWNA, "główna");
    // prosta forma
    $tpl->parse(MAIN, array("list_f", "main"));
    // forma złożona
    $tpl->parse(GŁÓWNA, ".list_el");
    // dołączanie formularza

    W prostej formie ładowany jest szablon o aliasie "main" (jeśli nie został jeszcze załadowany), wszystkie jego zmienne są podstawiane, a wynik jest zapisywany jako wartość zmiennej MAIN. Jeżeli zmienna (MAIN) pojawi się w późniejszych szablonach, zostanie zastąpiona wartością uzyskaną w wyniku przetworzenia szablonu „głównego”. Pozwala to na tworzenie zagnieżdżonych szablonów.

    Forma złożona metody parse() została zaprojektowana w celu ułatwienia zagnieżdżania szablonów. Następujące wpisy są równoważne:

    $tpl->parse(GŁÓWNA, "list_f");
    $tpl->parse(GŁÓWNA, ".main");

    to to samo co

    $tpl->parse(MAIN, array("list_f", "main"));

    W przypadku korzystania z formularza złożonego ważne jest, aby każdy szablon po pierwszym na liście zawierał zmienną, do której przekazywane są wyniki przetwarzania szablonu. W powyższym przykładzie main musi zawierać zmienną (MAIN), ponieważ to tam przekazywane są wyniki przetwarzania szablonu list_f. Jeżeli main nie zawiera zmiennej (MAIN), to wyniki przetwarzania szablonu list_f zostaną utracone.

    Styl append umożliwia dodanie wyników przetwarzania szablonu do zmiennej wynikowej. Kropka przed aliasem pliku szablonu mówi FastTemplate, aby dołączył wynik przetwarzania tego szablonu do zwróconych wyników, zamiast go zastępować. Styl ten jest najczęściej używany przy konstruowaniu tabel ze zmienną liczbą wierszy, uzyskaną np. w wyniku zapytania do bazy danych.

    Metoda FastPrint

    Składnia:

    FastPrint(przetworzona zmienna)

    Metoda FastPrint() drukuje zawartość przekazanej do niej przetworzonej zmiennej. Jeśli zostanie wywołana bez parametrów, to wypisywana jest ostatnia zmienna używana przez metodę parse().

    $tpl->FastPrint();
    /* jeśli kontynuujemy poprzedni przykład,
    wtedy ta funkcja wypisze wartość
    zmienna GŁÓWNA */
    $tpl->FastPrint("GŁÓWNA");
    // ta funkcja zrobi to samo

    Jeśli chcesz drukować nie na ekranie, ale na przykład do pliku, możesz uzyskać link do danych za pomocą metody fetch().

    $dane = $tpl->pobierz("GŁÓWNA");
    fwrite($fd, $dane); // zapis danych do pliku

    Rozwiązywanie problemu z FastTemplates

    Spróbujmy teraz zebrać wszystkie przebadane metody rozwiązania naszego problemu.

    Zauważ, że rozwiązanie problemu okazało się nieco bardziej skomplikowane niż w pierwszym przypadku, kiedy użyto tylko zwykłej funkcji zastępowania. Ale tutaj możemy zmienić trzy różne szablony (dokument jako całość, lista i element listy).

    Ta klasa szablonów poprzedzała wydanie PHP4 do pracy z PHP3. Aby przetestować powyższe przykłady, musisz pobrać bibliotekę klas FastTemplate i skopiować ten plik do katalogu roboczego. Jeśli pracujesz z PHP4, musisz wprowadzić kilka zmian w pliku class.FastTemplate.php3, które są opisane w dokumentacji dołączonej do tej biblioteki.

    Inteligentne szablony

    Smarty jest jednym z aktywnych projektów PHP, jego oficjalna strona internetowa to http://smarty.php.net. Można tam pobrać zarówno sam zestaw klasy Smarty, jak i jego dokumentację. Ten zestaw klas przetwarzania szablonów jest znacznie bardziej wydajny i funkcjonalny niż FastTemplate.Czym różni się Smarty od klas szablonów, takich jak FastTemplate? Przede wszystkim nie oddziela całkowicie logiki od treści. Według programistów Smarty, w szablonie może być obecna logika dotycząca wyświetlania danych. Dlatego w szablonie Smarty może być Instrukcje warunkowe, instrukcje wstawiania plików, instrukcje zmiany zmiennych, pętle itp. Kolejną cechą Smarty jest kompilacja szablonów. Szablony są tłumaczone na kod php, a interpreter PHP wykonuje wszystkie niezbędne czynności związane z podstawianiem wartości. Aby przyspieszyć działanie, skompilowane szablony są buforowane.

    Przyjrzyjmy się niektórym podstawowym konstrukcjom silnika szablonów Smarty.

    Instalacja

    Pierwszą rzeczą, od której zaczniemy, jest instalacja Smarty. Tutaj wszystko nie jest tak proste, jak w przypadku FastTemplate. Smarty nie składa się z pojedynczego pliku php z opisem klasy, ale z całego zestawu różnych plików bibliotecznych. Aby pracować z szablonami Smarty, musisz udostępnić te biblioteki wszystkim swoim programom. Znajdują się one w katalogu /libs/ dystrybucji Smarty. Plik zawierający definicję samej klasy Smarty nazywa się Smarty.class.php. Aby sprawdzić, czy biblioteki klas Smarty są dostępne, musisz napisać następujący skrypt:

    require("Smarty.class.php");
    // dołącz plik z
    // opis klasy Smarty
    $smarty = nowy Smarty;
    // utwórz instancję klasy Smarty
    ?>

    Jeśli podczas jego wykonywania wystąpi błąd, musisz wypróbować jedną z poniższych opcji.

    // dołącz plik z opisem klasy
    wymagaj("c:/users/my/Smarty/libs/
    Smarty.class.php");
    $smarty = nowy Smarty;
    // utwórz instancję klasy Smarty
    ?>

    Dodaj katalog zawierający biblioteki do include_path (w tym przypadku nie trzeba zmieniać kodu).

    zdefiniuj("SMARTY_DIR",
    "c:/users/my/Smarty/libs/index.html");
    wymagać(SMARTY_DIR."Smarty.class.php");
    $smarty = nowy Smarty;
    ?>

    Teraz, po upewnieniu się, że biblioteki zostaną odnalezione, musimy utworzyć katalogi niezbędne do działania Smarty, domyślnie o następujących nazwach:

    Szablony - katalog, w którym będziemy przechowywać stworzone szablony;

    Templates_c - katalog, w którym Smarty będzie przechowywać skompilowane szablony;

    Configs - katalog do przechowywania plików konfiguracyjnych;

    Pamięć podręczna - katalog pamięci podręcznej.

    Nazwy te są ustawiane przez właściwości $template_dir, $compile_dir, $config_dir, $cache_dir klasy Smarty, dzięki czemu można je nadpisać. Zaleca się używanie innego zestawu katalogów dla każdej aplikacji, która współpracuje z szablonami Smarty. Wymienione katalogi są dostępne przez bibliotekę Smarty i nigdy nie są dostępne bezpośrednio przez przeglądarkę internetową. Dlatego, aby uniknąć problemów z bezpieczeństwem, najlepiej umieścić te katalogi tam, gdzie nie ma dostępu przez www.

    Stwórzmy katalogi wymienione przez Smarty'ego w c:/smarty_dirs/book/. Zwróć uwagę, że nie można stąd odczytać danych przez przeglądarkę. Niech nasz program (lub aplikacja) będzie znajdować się w /~moje/zadania/książka/. Katalogi $compile_dir i $cache_dir Smarty będą wymagały dostępu do zapisu, więc będziesz musiał ustawić odpowiednie uprawnienia dla użytkownika sieciowego, który domyślnie uruchamia twój serwer (zazwyczaj www lub nikt).

    Aby przetestować wprowadzone przez nas ustawienia, stwórzmy prosty szablon i program przetwarzający go za pomocą silnika Smarty.

    index.tpl (jest szablonem Smarty i znajduje się w katalogu szablonów c:/smarty_dirs/book/templates/)

    (* Szablon Smarty *)
    Witaj ($imię)!

    index.php (jest kodem naszego programu i znajduje się w katalogu /~my/tasks/book/ lub równoważnie w katalogu c:/users/my/tasks/book/)

    W rezultacie powinieneś otrzymać:

    Cześć Wasia!

    Wszystkie ustawienia niezbędne do działania naszej aplikacji można umieścić w osobnym pliku i uporządkować jako rozszerzenie klasy Smarty.

    Podstawowa składnia

    Smarty to nie tylko klasa szablonów, definiuje cały język szablonów. Dotkniemy tylko jego głównych elementów. Więc jaki jest wzór Smarty? Jest to zestaw specjalnych konstrukcji (zmiennych, wywołań funkcji i metod itp.) oraz znaczników html. Wszystkie elementy (tagi) języka szablonów Smarty są zawarte między znakami ogranicznika. Domyślnie są to znaki nawiasów klamrowych „(” i „)”, ale można je zmienić. Wszystko, co nie jest zamknięte w takich ogranicznikach, Smarty traktuje jako stałe, które nie wymagają przetwarzania. W powyższym szablonie index.tpl ($name) jest zmienną, a ciągi „Hello” i „!” - stałe, które nie zmieniają się podczas przetwarzania szablonu.

    Komentarze w Smarty są pisane między dwiema gwiazdkami:

    (* To jest komentarz. Po przetworzeniu szablonu
    nie jest wyświetlany na ekranie *)

    Każdy tag Smarty wyświetla wartość zmiennej lub wywołuje funkcję. Funkcja jest napisana w następujący sposób:

    (nazwa_funkcji atrybut1="wartość1"
    atrybut2="wartość2")

    Zmienne w szablonie mogą mieć kilka typów:

    Zmienne, którym przypisano wartość w skrypcie php użytkownika, muszą mieć przed nazwą znak dolara.

    Na przykład: ($first_name)

    Elementy tablicy, których wartości zostały przypisane w skrypcie php użytkownika, dostępne są w szablonie za pomocą składni ($array_name.associative_key).

    Na przykład: ($osoba.nazwisko)

    Dostęp do elementów tablicy nieasocjacyjnej uzyskuje się za pomocą składni nawiasów kwadratowych: (nazwa_tablicy[indeks_numeryczny])

    Na przykład: ($osoba)

    Właściwości obiektu ustawione w skrypcie php są dostępne w szablonie przy użyciu następującej składni: (nazwa_obiektu->nazwa_właściwości)

    Na przykład: ($osoba->e-mail)

    Zmienne ładowane z plików konfiguracyjnych (co to jest, powiemy ci nieco później) są zawarte między # znakami. Są one również dostępne jako elementy tablicy asocjacyjnej $smarty.config.

    Na przykład: (#bodyBgColor#) lub ($smarty.config.bodyBgColor)

    Dodatkowo istnieje zmienna ($smarty) zarezerwowana dla niektórych specjalnych zmienne szablonu, takie jak żądanie HTTP, zmienne daty i godziny itp.

    Szablony Smarty definiują pewną liczbę modyfikatorów, które można zastosować do zmiennych, funkcji zdefiniowanych przez użytkownika lub ciągów w celu modyfikacji ich wartości. Aby zastosować modyfikator, należy określić jego nazwę po pionowej kreski następującej po nazwie zmiennej, funkcji lub ciągu, do którego jest stosowany.

    Na przykład, aby przetłumaczyć wartość zmiennej ($title) na duże litery, musisz zastosować do niego modyfikator górny, tj. napisz: ($tytuł|górny)

    Możesz użyć kilku modyfikatorów jednocześnie, oddzielając je od siebie linią prostą pionowy pasek. Na przykład ($title|upper|truncate) przekonwertuje wartość zmiennej na wielkie litery i skróci ją do 80 znaków.

    Nie wymienimy wszystkich dostępnych modyfikatorów. Ich listę można znaleźć w dokumentacji Smarty. Powiedzmy, że z ich pomocą możesz policzyć liczbę znaków, słów i akapitów, dodać linię, ustawić format daty i godziny, dokonać regularnej wymiany i wiele więcej.

    Pliki konfiguracyjne

    Pliki konfiguracyjne służą do zarządzania zmiennymi globalnymi używanymi w szablonie w jednym pliku. Ich pomysł jest bardzo podobny do stołów style css. Plik konfiguracyjny zawiera zestaw zmiennych i ich wartości. Żadne dodatkowe znaki, takie jak znak dolara, nie są umieszczane przed nazwą zmiennej. Wartość zmiennej jest opcjonalnie ujęta w cudzysłów (podwójny lub pojedynczy), jeśli składa się z kilku wierszy, to jest ujęta w potrójne cudzysłowy.

    # zmienne globalne
    pageTitle = "(!LANG:Lista dokumentów"!}
    bodyBgColor = #000000
    kolor tabeliBg = #000000
    rowBgColor = #00ff00
    pageTitle = "(!LANG:Lista artykułów"!}
    Intro = """Ta wartość składa się z
    wiele linii. Dlatego potrzebuje
    ujmij w potrójne cudzysłowy."""
    # ukryta sekcja
    [.Baza danych]
    host=lokalny host
    db=książka
    użytkownik=nina
    przepustka=123

    Plik konfiguracyjny może składać się z kilku sekcji (sekcji), z których każda ma nazwę i może być ładowana oddzielnie od innych sekcji. Nazwa sekcji jest ujęta w nawiasy kwadratowe. Oprócz sekcji plik konfiguracyjny może zawierać zmienne globalne - nie są one zawarte w żadnej sekcji i są zawsze ładowane podczas rozruchu plik konfiguracyjny. Jeśli ładowana jest jakakolwiek sekcja, ładowane są jej zmienne i zmienne globalne. Jeżeli zmienna istnieje zarówno jako zmienna globalna, jak i jako zmienna sekcji, używana jest zmienna sekcji. Jeśli nazwiesz dwie zmienne takie same w tej samej sekcji, zostanie użyta ostatnia. W powyższym przykładzie są dwie sekcje - Klient i Baza danych, a oprócz nich ustawione są zmienne globalne pageTitle, bodyBgColor, tableBgColor i rowBgColor.

    Aby ukryć wartość zmiennej lub całej sekcji, umieść kropkę przed jej nazwą. W takim przypadku podczas ładowania pliku konfiguracyjnego dane te nie będą czytelne. W tym przykładzie ukryliśmy sekcję Baza danych, aby hasło i nazwa użytkownika użyte do nawiązania połączenia nie były znane.

    mieszany preg_replace(wzór mieszany, zamiennik mieszany, temat mieszany [, limit int])

    Wyszukuje temat pod kątem dopasowań wzorca i zastępuje je zamiennikiem . W przypadku określenia parametru limitu wystąpienia limitu szablonu zostaną zastąpione; jeśli limit zostanie pominięty lub będzie równy -1, wszystkie wystąpienia wzorca zostaną zastąpione.

    Zastąpienie może zawierać referencje w postaci \\ n lub (od PHP 4.0.4) $n , oraz ostatnia opcja lepszy. Każde takie odniesienie zostanie zastąpione podłańcuchem odpowiadającym n-temu podwzorcowi w nawiasach.n może przyjmować wartości od 0 do 99, z referencją \\0 (lub $0) odpowiadającą wystąpieniu całego wzorca. od lewej do prawej, zaczynając od jednego .

    Podczas korzystania z zastępowania symboli wieloznacznych przy użyciu odwołań do podwzorów może wystąpić sytuacja, w której cyfra następuje bezpośrednio po masce. W tym przypadku notacja \\n skutkuje błędem: odwołanie do pierwszego podwzorca, po którym następuje 1, zostanie zapisane jako \\11 , co zostanie zinterpretowane jako odwołanie do jedenastego podwzorca. To nieporozumienie można wyeliminować za pomocą konstrukcji \$(1)1, która wskazuje na izolowane odniesienie do pierwszego podwzorca, po którym następuje cyfra 1 .

    Wynikiem tego przykładu będzie:

    1 kwietnia 2003

    Jeśli podczas wykonywania funkcji zostanie znalezione dopasowanie wzorca, zwrócona zostanie zmodyfikowana wartość tematu, w przeciwnym razie zostanie zwrócony oryginalny tekst tematu.

    Pierwsze trzy parametry funkcji preg_replace() mogą być tablicami jednowymiarowymi. Jeśli tablica używa kluczy, to podczas przetwarzania tablicy zostaną one pobrane w kolejności, w jakiej znajdują się w tablicy. Określanie kluczy w tablicy do wzorca i zamiany jest opcjonalne. Jeśli nadal zdecydujesz się na użycie indeksów, użyj funkcji, aby dopasować wzorce i ciągi zaangażowane w zamianę. ksort() dla każdej z tablic.


    Przykład 2: Używanie tablic z indeksami liczbowymi jako argumentów funkcji preg_replace()

    $ciąg = „Szybki brązowy lis przeskoczył nad leniwym psem”.;$wzory [ 0 ] = "/szybki/" ;
    $patterns [1] = "/brązowy/" ;
    $wzory [2] = "/lis/" ;$zamienniki [2] = "niedźwiedź" ;
    $zamienniki [1] = "czarny" ;
    $zamienniki [ 0 ] = "wolno" ;preg_replace ($wzory , $zamienniki , $ciąg );
    ?>

    Wynik:

    Wynik:

    Powolny czarny niedźwiedź przeskoczył nad leniwym psem.

    Jeśli parametr tematu jest tablicą, wyszukiwanie i zamiana wzorca jest wykonywane na każdym z jej elementów. Zwrócony wynik będzie również tablicą.

    W przypadku, gdy wzorzec parametrów i zamiennik są tablicami, preg_replace() wyodrębnia po kolei parę elementów z obu tablic i używa ich do operacji wyszukiwania i zamiany. Jeśli tablica zastępcza zawiera więcej elementów niż pattern , zamiast brakujących elementów zostaną pobrane puste ciągi do zastąpienia. Jeśli wzorzec jest tablicą, a zamiennik łańcuchem, to każdy element wzorca zostanie przeszukany i zastąpiony przez wzorzec (wzorzec będzie kolejno składał się z wszystkich elementów tablicy, podczas gdy zastępczy łańcuch pozostanie stały). Opcja, gdy wzorzec jest łańcuchem, a zamiennik tablicą, nie ma sensu.

    Modyfikator /e zmienia zachowanie funkcji preg_replace() w taki sposób, że parametr zastępujący, po wykonaniu niezbędnych podstawień, jest interpretowany jako kod PHP i dopiero wtedy używany do zastępowania. Używając tego modyfikatora, bądź ostrożny: parametr zastępujący musi zawierać poprawny kod PHP, w przeciwnym razie w linii zawierającej wywołanie funkcji preg_replace(), wystąpi błąd składni.


    Przykład 3: Zastąp wieloma wzorami

    $wzory = tablica ( "/(19|20)(\d(2))-(\d(1,2))-(\d(1,2))/",
    "/^\s*((\w+))\s*=/" );
    $zamień = tablica("\\3/\\4/\\1\\2" , "$\\1 =" );
    echo preg_replace ($patterns , $replace , "(startDate) = 1999-5-27" );
    ?>

    Ten przykład wygeneruje:

    Konwertuje wszystkie znaczniki HTML na wielkie litery


    Przykład 5. Konwerter HTML na tekst

    // Wyjście $document musi zawierać dokument HTML.
    // Konieczność usunięcia wszystkich tagów HTML, sekcji JavaScript,
    // białe znaki. Konieczna jest również wymiana niektórych
    // encje HTML do ich odpowiedników.
    $wyszukiwanie = tablica( ""]*?>.*?"si", // Wytnij javaScript
    ""<[\/\!]*?[^<>]*?>"si" , // Usuwa tagi HTML
    ""([\r\n])[\s]+"" , // Usuwa białe znaki
    ""&(quot|#34);"ja" , // Zastępuje encje HTML
    ""&(amp|#38);"i" ,
    ""&(lt|#60);"ja" ,
    ""&(gt|#62);"i" ,
    ""&(nbsp|#160);"i" ,
    ""&(iexcl|#161);"i" ,
    ""&(cent|#162);"i" ,
    ""&(funt|#163);"i" ,
    ""&(kopia|#169);"i" ,
    ""(\d+);"e"); // interpretuj jako kod php$replace = array("" ,
    "" ,
    "\\1" ,
    "\"" ,
    "&" ,
    "<" ,
    ">" ,
    " " ,
    chr(161),
    chr(162),
    chr(163),
    chr(169 ),
    "chr(\\1)" );$text = preg_replace ($search , $replace , $document );
    ?>

    Z pewnością obrazy pliki dźwiękowe, informacje wideo, dane animacji i aplety stanowią ważną część zawartości sieci WWW, ale zdecydowana większość danych w sieci nadal ma postać tekstu – sekwencji znaków takich jak to zdanie. główny typ dane PHP, przeznaczony do reprezentowania tekstu, jest ciągiem.

    Opis ciągów w PHP

    Ciągi znaków to sekwencje znaków, które mogą być traktowane jako pojedyncza jednostka - przypisywane do zmiennych, przekazywane jako dane wejściowe do funkcji, zwracane z funkcji lub wysyłane jako dane wyjściowe do wyświetlenia na stronie internetowej użytkownika. Najprostszy sposób określenie ciągu znaków w kodzie PHP polega na umieszczeniu sekwencji znaków w cudzysłowach, pojedynczych ("") lub podwójnych ("), na przykład w następujący sposób:

    $myString = "Prosty ciąg"; $anotherString = "Kolejny ciąg";

    Różnica między cudzysłowami pojedynczymi a cudzysłowami podwójnymi wynika z tego, jak szeroko środowisko PHP interpretuje znaki cudzysłowów przed utworzeniem właściwego ciągu. Jeśli ciąg jest ujęty w pojedyncze cudzysłowy, to prawie żadna interpretacja nie jest wykonywana, a jeśli ciąg jest ujęty w podwójne cudzysłowy, środowisko PHP dokonuje podstawienia wartości wszystkich zmiennych określonych w ciągu, a także zastępuje niektóre sekwencje znaków specjalnych, które zaczynają się od znaku odwrotnego ukośnika ().

    Na przykład po przetworzeniu następującego kodu, który jest częścią strony internetowej:

    $liczba = 13; $string1 = "Ciąg \"Hello, world!\" zawiera $count znaków.
    "; $string2 = "Ciąg \"Hello, world!\" zawiera $count znaków.
    "; echo $ciąg1; echo $ciąg2;

    możesz spodziewać się następujących danych wyjściowych w oknie przeglądarki:

    Podstawianie wartości za pomocą nawiasów klamrowych

    W większości sytuacji możesz po prostu ująć zmienną w łańcuchu w podwójnych cudzysłowach, a wartość zmiennej zostanie podstawiona w łańcuchu, gdy interpreter przetworzy łańcuch. Jednak w dwóch opisanych poniżej sytuacjach może się okazać, że interpreter ciągów znaków nie jest w stanie podjąć świadomej decyzji i potrzebuje dodatkowych wskazówek od dewelopera.

    Pierwsza sytuacja polega na tym, że interpreter nie może określić, gdzie kończy się nazwa zmiennej, a druga sytuacja ma miejsce, gdy konieczne jest podstawienie wartości wyrażenia do ciągu, a nie wartości prostej zmiennej. W takich przypadkach deweloper może wyjaśnić, umieszczając nazwę lub wyrażenie do przetworzenia w nawiasach klamrowych (()).

    Na przykład interpreter PHP nie ma problemu z przetwarzaniem następującego kodu:

    $sport = "siatkówka"; $play = "Uwielbiam grać w $sport.";

    W takich przypadkach interpreter napotyka znak $, a następnie rozpoczyna podciąg znaków w celu ujawnienia nazwy zmiennej i robi to, dopóki nie napotka spacji lub kropki następującej po nazwie zmiennej $sport. Spacje i kropki nie mogą być częścią nazwy zmiennej, więc staje się jasne, że dana zmienna ma nazwę $sport; interpreter PHP następnie z powodzeniem znajduje wartość dla danej zmiennej ("siatkówka") i zastępuje ją.

    Czasami jednak nie jest możliwe oznaczenie końca nazwy zmiennej spacją lub kropką. Rozważmy następujący przykład:

    $sport1 = "będzie"; $sport2 = "stopa"; $sport3 = "koszyk"; // Nieprawidłowe konstrukcje $play1 = "Uwielbiam grać w $sport1ball."; $play2 = "Uwielbiam grać w $sport2ball."; $play3 = "Uwielbiam grać w $sport3ball.";

    W takim przypadku pożądany efekt nie zostanie osiągnięty, ponieważ interpreter PHP uzna ciąg $sport1 za część zmiennej o nazwie $sport1ball, której najwyraźniej nie przypisano żadnej wartości. Zamiast tego musisz użyć następującej notacji:

    // Poprawna konstrukcja $play1 = "Lubię grać w ($sport1)piłkę."; $play2 = "Uwielbiam grać w ($sport2)piłkę."; $play3 = "Uwielbiam grać w piłkę ($sport3).";

    Ta notacja mówi interpreterowi PHP, że tylko wartość wyrażenia z nazwą zmiennej ujętą w nawiasy klamrowe musi zostać oceniona przed podstawieniem wartości.

    Z podobnych powodów interpreter PHP, o ile nie stosuje się nawiasów klamrowych, ma trudności z podstawianiem wartości wyrażeń złożonych nazwami zmiennych, np. dostępami do elementów. tablice wielowymiarowe i zmienne obiektowe. Główna zasada jest to, że jeśli po otwierającym nawiasie klamrowym (() następuje natychmiast symbol $, to interpreter PHP ocenia wartość wyrażenia z nazwą zmiennej aż do zamykającego nawiasu klamrowego ()), a następnie podstawia wynikową wartość do strunowy. (Jeśli chcesz, aby w ciągu pojawiła się wartość literału ($), można to zrobić, poprzedzając każdy z tych znaków ukośnikiem odwrotnym, \).

    Znaki i indeksy znaków w ciągach

    W przeciwieństwie do niektórych innych języków programowania, PHP nie ma oddzielnego typ znaku, który nie jest zgodny z typem ciągu. Ogólnie rzecz biorąc, funkcje wymagające rzeczywistych parametrów znaków w innych językach są zaprojektowane tak, aby przyjmowały ciągi o długości 1 w PHP.

    Wybór poszczególnych znaków z ciągu można wykonać, określając numer seryjny znak liczony od zera, który musi być określony w nawiasy klamrowe bezpośrednio po nazwie zmiennej ciągu. Takie znaki są w rzeczywistości ciągami jednoznakowymi. Na przykład uruchomienie następującego kodu:

    $myString = "Podwojony"; for ($indeks = 0; $indeks< strlen($myString); $index++) { $char = $myString{$index}; print("$char$char"); }

    skutkuje następującymi danymi wyjściowymi w oknie przeglądarki:

    Oczywiście każdy znak ciągu jest wypisywany dwukrotnie przy każdym przejściu przez pętlę. Funkcja strlen() zwraca długość ciągu.

    Operacje na ciągach

    PHP udostępnia dwie operacje na łańcuchach: operator kropki (.) lub operator konkatenacji oraz operator kropki i znaku równości (.=) lub operator konkatenacji i przypisania. Rozważmy następujący przykład:

    $string1 = "To jest część"; $string2 = "string"; // Łączenie ciągów echo $string1." simple ".$string2."
    "; // "To jest część prostego ciągu" // Połącz i przypisz $ciąg1 .= " simple "; // Odpowiednik $ciąg1 = $ciąg1." simple "; $ciąg1 .= $ciąg2; echo $ciąg1; // "To jest część prostego ciągu"

    Należy zauważyć, że w powyższym przykładzie pierwsza instrukcja echo nie jest przekazywana w wielu rzeczywistych parametrach ciągu; przekazywany jest tylko jeden rzeczywisty parametr ciągu, wynikający z połączenia czterech ciągów. Pierwszy i trzeci wiersz są ustawiane za pomocą zmiennych, a drugi i czwarty wiersz to dosłowny ciąg ujęty w podwójne cudzysłowy.

    Struktura składni dokumentu podrzędnego (Heredoc)

    Oprócz struktur składniowych ciągów w pojedynczych i podwójne cudzysłowy, PHP ma inny sposób określania ciągu, zwany składniową strukturę dokumentu zagnieżdżonego (Heredoc). Jak się okazało, taka struktura składniowa jest bardzo wygodnym sposobem określania dużych fragmentów tekstu podstawionych za pomocą zmiennych, ponieważ eliminuje potrzebę wskazywania przez użytkownika cudzysłowów wewnętrznych za pomocą znaki specjalne. Ta metoda jest szczególnie przydatna podczas tworzenia stron zawierających formularze HTML.

    Znak operatora używany w strukturze składniowej poddokumentu to (<<<). За этим знаком должна непосредственно следовать метка (не заключенная в кавычки), которая обозначает начало многострочного текста. Интерпретатор PHP продолжает включать в состав значения переменной следующие строки до тех пор, пока снова не появится эта же метка в начале строки. За заключительной меткой может следовать необязательная точка с запятой, а какие-либо другие символы после метки не допускаются.

    Rozważmy następujący przykład:

    $ciąg =<<

    EOT; echo $ciąg;

    Zwróć uwagę, że ostatnie słowo EOT pokazane powyżej nie powinno być w ogóle wcięte, w przeciwnym razie będzie traktowane jako należące do dodatkowego zawartego tekstu. Nie jest konieczne używanie słowa "EOT" jako etykiety, etykieta może mieć dowolną nazwę, zgodnie ze zwykłymi konwencjami nazewnictwa zmiennych PHP.

    Podstawianie zmiennych odbywa się za pomocą dokładnie tej samej metody, co w przypadku łańcuchów ujętych w podwójne cudzysłowy. Wygodną cechą dokumentu zagnieżdżonego jest to, że w tak oznaczonym tekście można wpisywać cudzysłowy bez użycia jakichkolwiek znaków kontrolnych, co nie prowadzi do przedwczesnego zakończenia tworzenia linii. Powyższy przykład wyświetla prosty formularz HTML:

    Funkcje ciągów

    Język PHP udostępnia szeroką gamę funkcji do przetwarzania i konwertowania ciągów. Jeśli kiedykolwiek będziesz musiał stworzyć własną funkcję, która odczytuje i przetwarza ciągi znak po znaku, aby utworzyć nowy ciąg, najpierw zastanów się, czy ktoś inny nie miał wcześniej do czynienia z podobnym zadaniem. A jeśli intuicja podpowiada, że ​​taka możliwość istnieje, to być może istnieje wbudowana funkcja, która rozwiązuje problem. Więcej informacji na temat funkcji ciągów można znaleźć na stronie https://php.net/manual/en/ref.strings.php .

    Ta sekcja przedstawia podstawowe funkcje sprawdzania, porównywania, modyfikowania i drukowania ciągów. Aby naprawdę opanować możliwości manipulowania ciągami znaków w PHP, wydaje się, że należy przynajmniej pobieżnie zapoznać się ze wszystkim, o czym mowa w tej sekcji. Opis funkcji przeznaczonych do pracy z wyrażeniami regularnymi można znaleźć w poniższym artykule.

    Walidacja ciągu

    Jakie są najczęstsze pytania dotyczące ciągów znaków, na które należy odpowiedzieć? Pierwsze na liście pytań jest pytanie o długość sznurka; aby na nie odpowiedzieć, używana jest funkcja strlen(), której nazwa jest skrótem od string length - długość stringu. Przykład użycia takiej funkcji pokazano poniżej:

    $enStr = "Witaj świecie!"; $rusStr = "Prosty ciąg"; echo $enStr." - ".strlen($enStr)." znaków
    "; echo $rusStr." - ".strlen($rusStr)." postacie";

    Uruchomienie tego kodu daje następujące niejednoznaczne dane wyjściowe:

    Jak widać, dla ciągu „Hello world!” wynik jest poprawny, ale dla ciągu „Simple string” wynik 27 znaków jest niepoprawny. O co tu chodzi? Faktem jest, że funkcja strlen() liczy bajty, a nie znaki. W pierwszym przypadku wszystkie znaki w ciągu są w języku angielskim, tj. są reprezentowane przez kodowanie ASCII i zakodowane jako 1 bajt. W drugim przypadku ciąg zawiera znaki rosyjskie, które są zakodowane w 2 bajtach (UTF-8). Aby uniknąć późniejszych problemów podczas pracy z funkcjami łańcuchowymi, PHP powinno używać funkcji do kodowania wielobajtowego, które zaczynają się od prefiksu mb_. Oznacza to, że w poprzednim przykładzie musisz zastąpić funkcję strlen() funkcją mb_strlen() i wyraźnie określić kodowanie:

    Echo $rus_str." - ".mb_strlen($rus_str, "UTF8")." znaki";

    Znajdowanie znaków i podciągów

    Kolejne pytanie dotyczące łańcuchów dotyczy ich zawartości. Na przykład funkcja strpos() pozwala znaleźć numer pozycji określonego znaku w ciągu, jeśli taki istnieje:

    $enStr = "Witaj świecie!"; echo "Symbol "l": ".strpos($enStr, "l"); // 2

    Sytuacje wymagające użycia funkcji strpos() to przypadki, w których niewrażliwość PHP na typ może być problemem. Jeśli dopasowanie nie zostanie znalezione, funkcja zwraca fałsz, a jeśli wyszukiwany znak pasuje do pierwszego znaku w ciągu, funkcja zwraca 0 (ponieważ pozycje znaków w ciągu zaczynają się od 0, a nie od 1). Obie te wartości odpowiadają fałszowi, gdy są używane do testowania warunku logicznego. Jednym ze sposobów rozróżnienia tych wartości jest użycie operatora porównywania tożsamości (operatora ===, wprowadzonego od PHP4), który zwraca prawdę tylko wtedy, gdy jego operandy są takie same i są tego samego typu. Operator porównywania tożsamości może służyć do testowania, czy zwracana wartość wynosi 0 (lub fałsz) bez ryzyka pomylenia zwracanej wartości z innymi wartościami, które mogą stać się takie same po rzutowaniu.

    Funkcji strpos() można również użyć do wyszukania podciągu zamiast pojedynczego znaku. Aby to zrobić, wystarczy podać jako pożądany ciąg wieloznakowy, a nie jednoznakowy. Ponadto w wywołaniu tej funkcji można określić dodatkowy parametr typu integer, który określa pozycję początku wyszukiwania.

    Możliwe jest również wyszukiwanie w przeciwnym kierunku, od końca ciągu do początku. Służy do tego funkcja strrpos(). (Zauważ, że ta funkcja ma w nazwie dodatkowe r, co jest skrótem od reverse.) Ta funkcja przyjmuje jako parametry ciąg do wyszukania i ciąg jednoznakowy do wyszukania, a następnie zwraca ostatnie wystąpienia pozycji drugiego parametru w pierwszym parametrze. (W przeciwieństwie do funkcji strpos(), w funkcji strrpos() poszukiwany ciąg musi składać się tylko z jednego znaku.) Po zastosowaniu tej funkcji z tymi samymi parametrami, co w poprzednim przykładzie, zostanie znaleziona inna pozycja:

    $enStr = "Witaj świecie!"; echo "Symbol "l": ".strrpos($enStr, "l"); // 9 ponieważ wyszukiwanie rozpoczyna się od końca ciągu

    Porównanie

    Czy ta linia pasuje do tej linii? Najwyraźniej kod często musi również odpowiedzieć na to pytanie, zwłaszcza jeśli chodzi o obsługę danych wejściowych od użytkownika końcowego.

    Najprostszą metodą znalezienia odpowiedzi na pytanie, czy łańcuchy są takie same, jest użycie prostego operatora porównania równości (==), który sprawdza równość nie tylko łańcuchów, ale także liczb. W przypadku korzystania z operatora == dwa ciągi są uważane za takie same, jeśli zawierają dokładnie te same sekwencje znaków. Nie jest to sprawdzane pod kątem bardziej rygorystycznej definicji identycznych ciągów, na przykład warunku, że te ciągi są przechowywane pod tym samym adresem w pamięci, ale uwzględnia wielkość liter (innymi słowy, czy porównywane litery są wielkimi czy małymi literami).

    Wyniki porównania dwóch ciągów za pomocą operatora == (lub odpowiednich operatorów< и >) można ufać tylko wtedy, gdy oba operandy są łańcuchami i wiadomo, że nie nastąpiła konwersja typu. A wynikom sprawdzenia za pomocą funkcji strcmp(), opisanej poniżej, zawsze można ufać.

    Najważniejszą funkcją porównywania ciągów, która wykonuje większość pracy, jest strcmp(). Ta funkcja pobiera dwa łańcuchy jako parametry i porównuje bajt po bajcie, aż znajdzie różnicę. Funkcja zwraca następnie liczbę ujemną, jeśli pierwszy ciąg jest mniejszy od drugiego, i dodatnią, jeśli drugi ciąg jest mniejszy od pierwszego. Jeśli ciągi są identyczne, funkcja strcmp() zwraca zero.

    Funkcja strcasecmp() działa w ten sam sposób, z wyjątkiem tego, że porównanie równości nie uwzględnia wielkości liter. Na przykład wywołanie strcasecmp("hej!", "HEJ!") powinno zwrócić zero.

    Szukaj

    Opisane właśnie funkcje porównujące informują o tym, czy jeden ciąg jest równy innemu ciągowi. Aby określić, czy jeden ciąg jest zawarty w innym, użyj funkcji strpos() opisanej powyżej lub funkcji strstr() i podobnych funkcji.

    Funkcja strstr() przyjmuje jako parametry ciąg do przeszukania i ciąg do przeszukania (w tej kolejności). Jeśli się powiedzie, ta funkcja zwraca część ciągu, która zaczyna się od pierwszego wystąpienia szukanego ciągu (i zawiera szukany ciąg). Jeśli nie zostanie znaleziony taki ciąg, funkcja zwróci false. Poniższy fragment kodu zawiera przykłady użycia tej funkcji:

    $str = "Witaj świecie!"; $findStr = "świat"; echo "Podciąg" $findStr" w oryginalnym ciągu: ".strstr($str, $findStr);

    Podobnie jak funkcja strcmp(), funkcja strstr() ma wersję niewrażliwą na wielkość liter o nazwie stristr() (i w tej nazwie jest skrótem od niewrażliwego). Funkcja stristr() jest pod każdym względem identyczna z funkcją strstr(), z wyjątkiem tego, że porównanie traktuje małe litery jako ich odpowiedniki.

    Próbkowanie podciągów

    Wiele funkcji napisów PHP wykonuje operacje wycinania i wklejania na napisach. Cięcie to zaznaczenie fragmentu struny, a wstawienie to selektywna modyfikacja struny. Należy pamiętać, że nawet funkcje wstawiania (najczęściej) nie modyfikują ciągu podanego jako parametr wejściowy. Zazwyczaj takie funkcje zwracają zmodyfikowaną kopię i pozostawiają oryginalny parametr bez zmian.

    Najprostszym sposobem spróbkowania części ciągu jest użycie funkcji substr(), która zwraca nowy ciąg zawierający część podciągu znaków ze starego ciągu. Funkcja substr() przyjmuje jako parametry ciąg (z którego ma być próbkowany podciąg), liczbę całkowitą (pozycja, w której rozpoczyna się żądany podciąg) oraz opcjonalny trzeci parametr w postaci liczby całkowitej, który określa długość żądanego podciągu. Jeśli trzeci parametr nie zostanie określony, zakłada się, że podciąg będzie kontynuowany do końca ciągu. (Należy pamiętać, że podczas korzystania z tej funkcji numeracja pozycji w linii zaczyna się od zera, a nie od jedynki, jak we wszystkich parametrach funkcji PHP, które oznaczają pozycje numeryczne w ciągach.) Na przykład:

    $str = "Witaj świecie!"; echo mb_substr($str, 7, 3, "UTF8"); // "świat"

    Zarówno parametr pozycji początkowej, jak i parametr długości mogą być ujemne, ale w obu przypadkach wartość ujemna ma inne znaczenie. Jeśli pozycja początkowa jest ujemna, pozycja znaku początkowego podciągu jest określana przez odliczanie wstecz od końca ciągu, a nie odliczanie do przodu od początku ciągu. (Pozycja początkowa -1 oznacza, że ​​licznik zaczyna się od ostatniego znaku, wartość -2 oznacza przedostatni znak itd.)

    Na tej podstawie można założyć, że ujemna wartość długości oznacza również, że podciąg powinien być określany przez odliczanie wstecz od znaku początkowego, a nie odliczanie do przodu, ale tak nie jest. Stwierdzenie, że znak na pozycji początkowej jest pierwszym znakiem w zwracanym ciągu (a nie ostatnim) jest zawsze prawdziwe. Zamiast tego ujemny parametr długości oznacza, że ​​znak końcowy jest określany przez odliczanie wstecz od końca, a nie odliczanie do przodu od pozycji początkowej.

    Poniżej kilka przykładów z parametrami dodatnimi i ujemnymi:

    $str = "Witaj świecie!"; echo mb_substr($str, 7, 3, "UTF8")."
    "; // "świat" echo mb_substr($str, -4, 3, "UTF8")."
    "; // "świat" echo mb_substr($str, 0, -5, "UTF8")."
    "; // "Cześć"

    Usuwanie spacji i tabulatorów z napisów

    Z technicznego punktu widzenia funkcje chop(), ltrim() i trim() są funkcjami do pracy z podciągami (które są bardzo podobne do innych funkcji), ale w rzeczywistości funkcje te są przeznaczone do usuwania niechcianych znaków z łańcuchów. Funkcje chop(), ltrim() i trim(), odpowiednio, usuwają końcowe, wiodące, wiodące i końcowe białe znaki z ciągu podanego jako jedyny parametr ciągu.

    Oprócz spacji, funkcje te usuwają inne białe znaki, takie jak te wskazane przez sekwencje specjalne \n, \r, \t i \0 (znaki końca wiersza, tabulatory i znaki null używane do oznaczenia końca wiersza w programach C).

    W PHP często używa się funkcji do usuwania białych znaków na końcu łańcucha, nazywanej chop(), ale można również wywołać identyczną funkcję, bardziej opisowo nazwaną rtrim(). Na koniec należy zauważyć, że funkcja chop(), pomimo tego, że jej nazwa, co oznacza „odciąć”, brzmi bardzo groźnie, nie uszkadza oryginalnego parametru $original, który zachowuje poprzednią wartość.

    Wymiana sznurka

    Wszystkie omówione powyżej funkcje ciągów służą do pobierania części parametru wejściowego, zamiast tworzenia zupełnie nowego ciągu. W tej sekcji omówiono funkcje str_replace() i substr_replace() przeznaczone do tego celu.

    Funkcja str_replace() umożliwia zastąpienie wszystkich wystąpień danego podciągu innym ciągiem. Ta funkcja przyjmuje trzy parametry: ciąg do przeszukania, podciąg, który ma zostać zastąpiony po znalezieniu, oraz ciąg, który ma zostać użyty do zamiany. Rozważmy następujący przykład:

    $str = "Witaj świecie!"; echo str_replace("świat", "planeta", $str); // „Witaj planeto!”

    Zastąpienie jest wykonywane na wszystkich wystąpieniach podciągu znalezionego w wyszukiwanym ciągu. Gdyby powyższy przykład posłużył do zamiany nazwy miasta w przestarzałej encyklopedii, to po skonwertowaniu całego tekstu encyklopedii do pojedynczej linii PHP, taką zamianę w całym tekście można by wykonać w jednym przejściu.

    Jak pokazano powyżej, funkcja str_replace() wybiera część ciągu źródłowego do zastąpienia, szukając wystąpień żądanego podciągu w ciągu źródłowym; w przeciwieństwie do tego, substr_replace() wybiera część do zastąpienia przez jej pozycję bezwzględną. Ta funkcja przyjmuje do czterech parametrów: ciąg, który ma zostać zastąpiony, ciąg, który ma zostać zastąpiony, początkową pozycję zastąpienia i (jako parametr opcjonalny) długość części ciągu, która ma zostać zastąpiona. Rozważmy następujący przykład:

    echo substr_replace("ABCDEFG", "-", 2, 3); // "AB-FG"

    Część CDE ciągu została zastąpiona pojedynczym znakiem. Zauważ, że w tym przypadku dozwolone było zastąpienie podciągu łańcuchem o innej długości. Jeżeli parametr length zostanie pominięty, to zakłada się, że cała część ciągu po pozycji początkowej zostanie zastąpiona.

    Funkcja substr_replace() akceptuje również parametry ujemne jako pozycję początkową i długość, które są traktowane dokładnie tak, jak w funkcji substr() powyżej. Należy pamiętać, że w wyniku operacji wykonywanych za pomocą funkcji str_replace i substr_replace, oryginalny ciąg pozostaje niezmieniony.

    Wreszcie istnieje szereg rzadziej używanych funkcji, które tworzą nowe ciągi ze starych. Funkcja strrev() po prostu zwraca nowy ciąg z odwróconymi znakami w ciągu wejściowym. Funkcja str_repeat() pobiera jeden ciąg znaków i jeden parametr typu integer i zwraca ciąg znaków zawierający określoną liczbę kopii parametru ciągu:

    echo str_repeat("ABC", 3); // ABCABCABC

    Funkcje konwersji wielkości liter

    Te funkcje umożliwiają konwersję małych liter na wielkie i odwrotnie. Funkcja strtolower() zwraca ciąg ze wszystkimi literami zamienionymi na małe. Nie ma znaczenia, czy oryginalny ciąg zawierał tylko wielkie litery, czy wielkie i małe litery. Na przykład:

    $str = "Witaj świecie!"; echo mb_strtolower($str, "UTF8"); // "Witaj świecie!"

    Jeśli doświadczyłeś już potrzeby wykonywania wielu walidacji formularzy, być może zauważyłeś, że funkcja strtolower() jest niezwykle przydatnym narzędziem do obsługi adresów e-mail otrzymanych od użytkowników, którzy nadal nie wiedzą, że adresy e-mail są prawdziwe -niewrażliwy. Nie mniej przydatne są inne funkcje związane z tą kategorią.

    Funkcja strtoupper() zwraca ciąg ze wszystkimi literami zamienionymi na wielkie. Przykładem jest następujący fragment kodu:

    $str = "Witaj świecie!"; echo mb_strtoupper($str, "UTF8"); // "WITAJ ŚWIECIE!"

    Funkcja ucfirst() zmienia na wielką literę tylko pierwszą literę ciągu, funkcja ucwords() zmienia na wielką pierwszą literę każdego słowa w ciągu. Ani funkcja ucwords(), ani ucfirst() nie mają podobnej funkcji do kodowania wielobajtowego, więc nie są kompatybilne z ciągami cyrylicy.

    Funkcje wprowadzania znaków sterujących

    Jedną z zalet języka PHP jest to, że może być używany do wymiany danych z prawie każdym systemem. Środki tego rodzaju są zwykle uważane za rodzaj "kleju programowego". W tej roli język PHP jest używany do interakcji z serwerami baz danych, serwerami LDAP, do wymiany danych przez gniazda oraz do samego połączenia HTTP. Często ta interakcja odbywa się poprzez utworzenie najpierw ciągu komunikatu (takiego jak zapytanie do bazy danych), a następnie przekazanie go do programu odbierającego. Ale programy często nadają specjalne znaczenie niektórym znakom i dlatego muszą być przekonwertowane na znaki kontrolne. Oznacza to, że program odbierający jest instruowany, aby traktować takie znaki jako dosłowną część ciągu, zamiast stosować wobec nich specjalne traktowanie.

    Wielu użytkowników, aby poradzić sobie z tym problemem, umożliwia korzystanie z tak zwanego „trybu magicznych cudzysłowów”, który zapewnia, że ​​cudzysłowy są konwertowane na znaki kontrolne przed wstawieniem ciągów do bazy danych. Ale jeśli taki tryb przetwarzania nie jest możliwy lub pożądany, to trzeba użyć starego dobrego sposobu wstawiania znaków odwrotnego ukośnika, a następnie usuwania tych znaków.

    Funkcja addslashes() konwertuje pojedyncze i podwójne cudzysłowy, ukośniki odwrotne i znaki null na sekwencje specjalne przy użyciu ukośników odwrotnych, ponieważ są to znaki, które zazwyczaj muszą zostać przekonwertowane na sekwencje specjalne podczas przygotowywania zapytań do baz danych:

    $escapedstring = addslashes("Ciąg z "cytatami"."); $query = "WSTAW wartości testowe (cytat) ("$escapedstring""); $wynik = mysqli_query($link, $zapytanie) lub die(mysql_error());

    Uruchomienie tego kodu zapobiega błędnej interpretacji instrukcji SQL, tak jakby ciąg kończył się tuż przed literą „k”. A po pobraniu tych danych musisz użyć funkcji stripslashes(), aby usunąć ukośniki odwrotne.

    Funkcja quotemeta() konwertuje szerszy zestaw znaków na sekwencje specjalne. Wszystkie te znaki mają zwykle specjalne znaczenie w wierszu poleceń systemu Unix: " .", " " " , " + " , " * " , " ? „, „[”, „]”, „^”, „(”, „$” i „)”. Na przykład uruchomienie następującego kodu:

    $str = "Te znaki ($, *, ^) muszą zostać przekonwertowane."; echo cytatmeta($str);

    wyprowadza tę linię:

    Funkcje wyjściowe do urządzenia zewnętrznego i do linii

    Głównymi konstrukcjami używanymi do wyświetlania danych wyjściowych są print i echo, które zostały szczegółowo omówione wcześniej. Standardowym sposobem wyprowadzania wartości zmiennych do urządzenia zewnętrznego jest uwzględnienie nazw tych zmiennych w łańcuchu w cudzysłowie (który jest przetwarzany przez interpreter w celu podstawienia wartości zmiennych), a następnie przekazanie ten ciąg do konstrukcji print lub echo.

    Jeśli potrzebujesz jeszcze dokładniej sformatowanego wyjścia, możesz użyć funkcji printf() i sprintf() PHP. Te dwie funkcje przyjmują te same parametry: specjalny łańcuch formatujący, po którym następuje dowolna liczba innych parametrów, które są podstawiane we właściwych miejscach w łańcuchu formatującym w celu uzyskania wyniku. Jedyna różnica między printf() i sprintf() polega na tym, że printf() wysyła łańcuch wynikowy bezpośrednio do urządzenia zewnętrznego używanego do wyjścia, podczas gdy sprintf() zwraca łańcuch wynikowy jako wynik swojego wykonania.

    Kilka słów dla doświadczonych programistów C. Ta wersja sprintf() różni się nieco od wersji C tym, że sprintf() nie musi dostarczać zaalokowanego ciągu do zapisu, ponieważ interpreter PHP alokuje pamięć na wynikowy ciąg w imieniu użytkownik.

    Główną trudnością związaną z korzystaniem z tych funkcji jest prawidłowa definicja ciągu formatującego. Każdy znak w ciągu formatu pojawia się bezpośrednio w wartości wynikowej, z wyjątkiem znaków % i znaków, które występują bezpośrednio po tych znakach. Symbol % oznacza początek specyfikacji konwersji, która określa sposób wyprowadzania do urządzenia zewnętrznego jednego z parametrów następujących po ciągu formatu.

    Po znaku % znajduje się pięć elementów składających się na specyfikację konwersji, które opisano poniżej, a niektóre z nich są opcjonalne: dopełnienie, wyrównanie, minimalna szerokość, precyzja i typ:

    • Opcjonalny znak minus (-) służy do wskazania, czy liczba jest ujemna.
    • Pojedynczy (opcjonalny) znak wypełnienia to 0 lub spacja (). Ten symbol jest używany do wypełnienia wszelkich miejsc, które w innym przypadku byłyby puste, ale które użytkownik nalegał na wybranie (poprzez ustawienie zbyt wysokiego parametru minimalnej szerokości). Jeśli ten znak dopełniający nie jest określony, domyślnie dopełnia się spacjami.
    • Opcjonalny znak justowania (-) określa, czy wartość wyjściowa powinna być justowana do lewej czy do prawej. Jeśli ten znak zostanie określony, wartość zostanie wyrównana do lewej, a jeśli nie będzie, zostanie zastosowana wyrównanie do prawej.
    • Opcjonalna wartość liczbowa o minimalnej szerokości, która określa minimalną liczbę pozycji, jakie powinna zajmować wartość wyjściowa. (Jeśli wartości wyjściowe wymagają większej liczby pozycji znaków niż określono, wartość wyjściowa jest poza zakresem.)
    • Opcjonalny specyfikator dokładności, sformatowany jako kropka (.), po której następuje liczba. Specyfikator wskazuje, z jaką dokładnością, mierzoną liczbą miejsc dziesiętnych po kropce, powinna być wyprowadzana liczba zmiennoprzecinkowa podwójnej precyzji. (Zastosowanie tej specyfikacji nie ma wpływu na wyprowadzanie danych innych niż liczby zmiennoprzecinkowe o podwójnej precyzji).
    • Pojedynczy znak wskazujący, jak należy interpretować typ wartości. Znak f oznacza, że ​​wartość ma być wydrukowana jako liczba zmiennoprzecinkowa podwójnej precyzji, znak s wskazuje, że wartość ma być wydrukowana jako łańcuch, a pozostałe możliwe znaki (b, c, d, o, x, X ) wskazują, że wartość powinna być interpretowana jako liczba całkowita i wyprowadzana w różnych formatach. Te formaty to b dla wyjścia w formacie binarnym, c dla wyjścia znaku z odpowiednią wartością kodu ASCII, o dla wyjścia w formacie ósemkowym, x dla wyjścia w formacie szesnastkowym (z małymi literami cyfr) i X dla wyświetlania liczby szesnastkowe, które używają wielkich liter jako symboli dosłownych dla cyfr.

    Poniżej znajduje się przykład wyprowadzania tej samej liczby zmiennoprzecinkowej o podwójnej precyzji na kilka różnych sposobów:

    %10f 
    %-10f
    %2.2f", $wartość, $wartość, $wartość, $wartość); ?>

    Daje następujące wyniki:

    Konstrukcja użyta w tym przykładzie

    ...
    to deskryptor HTML, który informuje przeglądarkę, że blok zawarty w tym deskryptorze powinien być sformatowany dosłownie, bez kompresji wielu spacji w jedną itd.

    Funkcje do pracy z kodem HTML

    PHP udostępnia szereg funkcji do manipulowania ciągami zawierającymi dane specyficzne dla sieci. Przegląd tych funkcji znajduje się w poniższej tabeli:

    Funkcje ciągów zaprojektowane do pracy z kodem HTML

    Funkcjonować Opis
    htmlznaki specjalne() Pobiera ciąg jako parametr i zwraca ciąg, w którym cztery znaki, które mają specjalne znaczenie w języku HTML, zostały zastąpione specjalnymi ciągami. Każdy z tych znaków jest zastępowany przez odpowiedni składnik HTML, który jest ponownie zastępowany oryginalnym znakiem, gdy tekst strony jest rozwijany w przeglądarce. Znak & jest zastępowany przez znak & " (znak podwójnego cudzysłowu) - przez znak "< - < а символ > - >
    htmlentities() Wykonuje bardziej kompletne przetwarzanie niż htmlspecialchars(), tj. zastępuje komponentem HTML nie tylko znaki specjalne, ale także wszystkie znaki, dla których przewidziano zastąpienie komponentem HTML
    get_html_translation_table() Pobiera jedną z dwóch stałych specjalnych (HTML_SPECIAL_CHARS lub HTML_ENTITIES) i zwraca tabelę konwersji używaną odpowiednio przez funkcje htmlspecialchars() lub htmlentities(). Tabela przeglądowa to tablica, której klucze są ciągami znaków, a odpowiadające im wartości są ciągami, które je zastępują.
    nl2br() Przyjmuje łańcuch jako parametr i zwraca ten sam łańcuch, ale z deskryptorami
    , wstawiony przed wszystkimi znakami końca wiersza (\n, \r lub \r\n). Konieczność skorzystania z tej funkcji pojawia się np. gdy chcemy zapewnić takie same paragrafy tekstu wyświetlanego w przeglądarce jak w tekście źródłowym
    strip_tags() Pobiera ciąg znaków jako parametr i stara się utworzyćłańcuch pozbawiony wszystkich deskryptorów HTML i wszystkich deskryptorów PHP

    Haszowanie danych za pomocą algorytmu MD5

    Algorytm MD5 to algorytm przetwarzania ciągów znaków, który służy do generowania tak zwanego skrótu lub podpisu cyfrowego dla dowolnego ciągu przekazywanego jako parametr. Algorytm generuje ciąg o stałej długości na podstawie ciągu wejściowego, składającego się z 32 cyfr szesnastkowych (0-9, a-f). Wyniki generowane przez algorytm MD5 mają bardzo przydatne właściwości, które opisano poniżej:

    • Algorytm MD5 zawsze zapewnia, że ​​ciąg wyjściowy jest taki sam, gdy podano ten sam ciąg wejściowy, więc szyfrowanie MD5 nie może być używane do przechowywania haseł.
    • Wyniki zastosowania algorytmu MD5 mają stałą długość i są bardzo równomiernie rozłożone w całym zakresie możliwych wartości.
    • Można wygenerować ciąg wejściowy odpowiadający danemu ciągowi wyjściowemu algorytmu MD5 lub można utworzyć dwa ciągi wejściowe, których przetwarzanie prowadziłoby do tego samego ciągu wyjściowego, ale tylko pod pewnymi warunkami.

    Implementacja algorytmu MD5 w PHP jest dostępna jako funkcja md5(), która pobiera ciąg znaków jako dane wejściowe i generuje wyniki w postaci 32-znakowego skrótu. Na przykład uruchomienie następującego kodu:

    $str = "Witaj świecie!"; echo "Kod skrótu dla ciągu "$str": ".md5($str)."
    "; $str = "Witaj, świecie!"; echo "Kod skrótu łańcucha "$str": ".md5($str)."
    "; $str = "Witaj świecie"; echo "Kod skrótu łańcucha "$str": ".md5($str)."
    ";

    skutkuje następującymi wynikami w oknie przeglądarki:

    Oczywiście w tym przypadku wszystkie ciągi wejściowe są do siebie bardzo podobne, ale ciągi wyjściowe nie mają żadnego widocznego podobieństwa. Ponadto zakres możliwych wartości wyjściowych jest niezwykle duży (1632), więc szanse na przetworzenie dwóch różnych ciągów (które dałyby tę samą wartość MD5) są bardzo mało prawdopodobne.

    Ze względu na powyższą charakterystykę algorytmu MD5, wartości uzyskane za jego pomocą mogą być wykorzystane do rozwiązania szerokiej gamy problemów, w tym opisanych poniżej:
    Obliczanie sumy kontrolnej wiadomości lub pliku
    Aby sprawdzić, czy wiadomość została uszkodzona podczas transmisji, możesz wraz z wiadomością wysłać skrót MD5 i ponownie wygenerować skrót MD5 po odebraniu wiadomości. Jeśli dwie wersje skrótu nie pasują, oznacza to, że podczas transmisji doszło do uszkodzenia.
    Kontrola nad tym, czy zawartość pliku pozostaje niezmieniona
    To zadanie jest podobne do zadania obliczania sumy kontrolnej. Algorytm MD5 jest często używany do wykonania tej operacji w wyszukiwarkach, jeśli wymagane jest okresowe sprawdzanie, czy strona internetowa się zmieniła i ponowne indeksowanie w razie potrzeby. Faktem jest, że dla dalszej weryfikacji znacznie łatwiej jest zorganizować przechowywanie skrótu MD5 niż całego pliku źródłowego.
    Dzielenie wielu ciągów lub plików na podzbiory
    Aby rozwiązać problem dzielenia zbioru łańcuchów na N losowo wybranych podzbiorów, możesz obliczyć skrót MD5 każdego łańcucha, wziąć kilka pierwszych znaków szesnastkowych, przekonwertować je na liczbę, uzyskać modulo modulo tej liczby i użyć tego reszta jako numer podzbioru, w którym należy wpisać ten wiersz.

    Oprócz funkcji md5() PHP udostępnia funkcję md5_file(), która jako parametr przyjmuje nazwę pliku i zwraca zaszyfrowaną wartość MD5 odpowiadającą zawartości pliku.

    Funkcje zaprojektowane do oceny podobieństwa ciągów

    W praktyce często konieczne staje się określenie, na ile podobne są dwie struny. Oczywiście wyniki estymacji podobieństwa strun zależą od tego, co rozumiemy pod pojęciem podobieństwa strun.

    Jeśli podobieństwo w pisowni jest uważane za kryterium oceny podobieństwa, można zastosować Wskaźnik Levenshteina. Funkcja levenshtein() przyjmuje dwa ciągi jako parametry i zwraca minimalną liczbę operacji dodawania, usuwania i zastępowania znaków wymaganych do konwersji jednego ciągu na inny. Rozważ przykład:

    echo levenshtein("Tim", "Czas"); // 1 echo levenshtein("chłopiec", "chefboyee"); // 9 echo levenshtein("nigdy", "sprytny"); // 2

    Jeśli podobieństwo fonetyczne jest traktowane jako kryterium podobieństwa, to do oceny podobieństwa można użyć funkcji soundex() i metaphone(). Obie te funkcje przyjmują dany ciąg jako dane wejściowe i zwracają kluczowy ciąg wskazujący kategorię wymowy danego słowa (które jest traktowane jako słowo angielskie). Jeśli dwa słowa użyte jako treść ciągu wejściowego odpowiadają dokładnie tej samej wartości wyjściowej, prawdopodobnie będą wymawiane tak samo.

    Funkcje parsowania i tokenizacji

    Czasami konieczne jest, aby program podzielił ciągi na komponenty, kierując się własną definicją tego, co powinno być uważane za komponent. Proces dzielenia długiego łańcucha na części nazywa się tokenizacją. W szczególności taki proces jest częścią ogólnej procedury interpretacji lub kompilacji dowolnego programu komputerowego, w tym programu napisanego w PHP. Język PHP udostępnia do tego celu specjalną funkcję - strtok().

    Funkcja strtok() przyjmuje dwa parametry: ciąg znaków do tokenizacji oraz ciąg znaków zawierający wszystkie ograniczniki (znaki, które są traktowane jako granice między tokenami). Przy pierwszym wywołaniu używane są oba parametry, a funkcja zwraca wartość ciągu reprezentującą pierwszy token. Aby wybrać kolejne tokeny, wykonywane jest to samo wywołanie, ale parametr ciągu źródłowego jest pomijany. Funkcja zapamiętuje adres ciągu podanego w pierwszym parametrze i używa go jako bieżącego ciągu. Ponadto funkcja ta zapamiętuje, gdzie przetwarzanie zostało zakończone w poprzednim wywołaniu. Rozważmy następujący przykład:

    $token = strtok("open-source HTML-osadzone skrypty WWW po stronie serwera", " "); while($token) ( echo $token."
    "; $token = strtok(" "); )

    co skutkuje następującym wynikiem w oknie przeglądarki:

    Oryginalny ciąg jest dzielony w miejscu, w którym znajduje się każda spacja.

    Funkcja strtok() buduje tokeny jeden po drugim. Możesz również użyć funkcji explode(), która wykonuje mniej więcej to samo, z wyjątkiem tego, że przechowuje wszystkie tokeny jednocześnie w jednej tablicy. Po otrzymaniu tokenów, reprezentowanych w postaci tablicy, można na nich wykonywać dowolne operacje, w tym sortowanie.

    Funkcja explode() przyjmuje dwa parametry: ciąg znaków ogranicznika i ciąg znaków, który ma zostać podzielony na tokeny. Ta funkcja zwraca tablicę, której każdy element jest podciągiem między wystąpieniami ogranicznika w ciągu do podziału. Rozważmy następujący przykład:

    $explodeResult = explode("I", "jeden AND dwa AND trzy");

    co daje w wyniku tablicę $explode_result zawierającą trzy elementy, z których każdy jest łańcuchem: "jeden", "dwa" i "trójka". W tym konkretnym przykładzie w żadnym z ciągów zawartych w tablicy nie występują duże litery, ponieważ w wyniku nie ma separatora AND.

    Łańcuch znaków separatora używany w funkcji explode() jest zupełnie inny niż łańcuch znaków z separatorem używany w funkcji strtok(). Ogranicznik jest pełnym ciągiem, więc wszystkie znaki w tym ciągu muszą znajdować się w ciągu źródłowym w tej samej kolejności, co w ograniczniku, aby ogranicznik został uznany za znaleziony.

    Z drugiej strony rozdzielony ciąg w funkcji strtok() określa wiele pojedynczych znaków, z których każdy jest traktowany jako ogranicznik. Oznacza to, że funkcja explode() jest bardziej selektywna, ale bardziej podatna na uszkodzenia. W szczególności, jeśli w długim łańcuchu przypadkowo pominie choćby pojedyncza spacja lub znak końca wiersza, który jest częścią ogranicznika, wtedy całe działanie tej funkcji może zostać przerwane.

    Funkcja explode() ma funkcję odwrotną, implode(), która przyjmuje dwa parametry: ciąg łączący (podobny do ciągu oddzielającego w funkcji explode()) oraz tablicę ciągów, podobną do tej zwracanej przez funkcję explode( ). Funkcja implode() zwraca ciąg znaków utworzony przez wstawienie ciągu łączącego wszystkie kolejne elementy ciągu w tablicy.

    Wartości typu string to ciągi tekstowe (w skrócie stringi). Ciąg to sekwencja zero lub więcej znaków. Symbole obejmują litery, cyfry, znaki interpunkcyjne, znaki specjalne i spacje.

    Ciąg można zdefiniować na cztery różne sposoby:

    • podwójne cudzysłowy
    • pojedyncze cytaty
    • składnia heredoc
    • składnia nowdoc

    Ciąg w podwójnych cudzysłowach

    Ciąg w cudzysłowie:

    Sekwencje specjalne mogą być używane w ciągach z podwójnym cudzysłowem. Sekwencja ewakuacyjna to znaki specjalne do formatowania tekstu wyjściowego. W PHP dostępne są następujące sekwencje specjalne:

    Główną właściwością łańcuchów w podwójnych cudzysłowach jest możliwość przetwarzania zmiennych w łańcuchach.


    Znak dolara: \$";

    Ciągi ujęte w podwójne cudzysłowy mogą zawierać pojedyncze znaki cudzysłowu:

    Echo "Pojedynczy cytat: "";

    Ciąg w pojedynczych cudzysłowach (apostrofy)

    Ciąg w pojedynczych cudzysłowach:

    $str = "ciąg"; echo "Jedną dużą linię można podzielić na kilka małych, aby ułatwić czytanie.";

    W przeciwieństwie do łańcuchów w podwójnych cudzysłowach i składni heredoc, zmienne i sekwencje specjalne (z jednym wyjątkiem) ujęte w pojedyncze cudzysłowy nie są analizowane. Oznacza to, że będą one interpretowane jako normalne znaki tekstowe:

    $liczba = 10; echo "Liczba: $liczba
    Znak dolara: \$";

    Aby móc używać pojedynczych cudzysłowów w łańcuchu ujętym w pojedyncze cudzysłowy, należy je zastąpić ukośnikiem odwrotnym (\"). Jeśli chcesz napisać sam ukośnik odwrotny, musisz go zduplikować (\\):

    Echo "Używane są wewnętrzne \"pojedyncze\" cudzysłowy"; echo "Odwrotny ukośnik: \\";

    Ciągi ujęte w pojedyncze cudzysłowy mogą zawierać znaki podwójnego cudzysłowu:

    Echo "Podwójny cytat: "";

    składnia heredoc

    Składnia Heredoc jest alternatywnym sposobem pisania łańcuchów.

    Ciąg znaków zdefiniowany przy użyciu składni Heredoc działa tak samo, jak ciąg znaków ujęty w podwójne cudzysłowy. Różnica między Heredoc a ciągiem w podwójnych cudzysłowach polega na tym, że przy użyciu Heredoc nie ma potrzeby unikania podwójnych cudzysłowów.

    Składnia Heredoc zaczyna się od trzech znaków<<< , после которых должен быть указан произвольный идентификатор (назовём его открывающим). Идентификатор может быть указан как в двойных кавычках, так и без них. Od razu po identyfikatorze musi następować znak nowej linii, nie powinno być żadnych innych znaków poza znakiem nowej linii po identyfikatorze, w przeciwnym razie wystąpi błąd. Następnie pojawia się rzeczywista zawartość ciągu. Po treści ciągu, w osobnym wierszu, musi znajdować się identyfikator zamykający (taki sam jak po<<<). Перед ним и после него не должно быть никаких пробелов или других символов, за исключением точки с запятой. Если это правило нарушено, то считается, что закрывающий идентификатор отсутствует и будет вызвана ошибка:

    <<

    składnia nowdoc

    Składnia Nowdoc, podobnie jak Heredoc, jest alternatywnym sposobem pisania łańcuchów.

    Ciąg zdefiniowany za pomocą składni Nowdoc działa tak samo, jak ciąg znaków ujęty w pojedyncze cudzysłowy. Różnica między Nowdoc a ciągiem w pojedynczym cudzysłowie polega na tym, że przy użyciu Nowdoc nie ma potrzeby unikania pojedynczych cudzysłowów.

    Składnia Nowdoc jest podobna do Heredoc, z tą różnicą, że identyfikator otwierający musi być ujęty w pojedyncze cudzysłowy:

    $liczba = 10; Echo<<<"some_id" Число: $num some_id;

    Obsługa zmiennych w ciągach

    Istnieją dwa rodzaje składni do obsługi zmiennych w łańcuchach: prosty oraz trudny.

    Prosta składnia- to jest, gdy nazwa zmiennej jest podana w wierszu bez zmian.

    Kiedy interpreter napotka znak dolara, zaczyna sekwencyjnie sprawdzać, czy wszystkie kolejne znaki są poprawnymi znakami w nazwie zmiennej. Tak więc, aby utworzyć prawidłową nazwę zmiennej, przechwytuje ona jak najwięcej znaków:

    $str = "Świat!"; echo "Witaj $str";

    Składnia złożona ma miejsce, gdy nazwa zmiennej jest ujęta w nawiasy klamrowe.

    Ponieważ, aby przetworzyć zmienną w ciągu, interpreter przechwytuje jak najwięcej znaków, zdarzają się sytuacje, w których interpreter nie jest w stanie samodzielnie określić, gdzie kończy się nazwa zmiennej:

    $sport1 = "będzie"; $sport2 = "stopa"; echo "Lubię $sport1ball i $sport2ball";

    W takim przypadku pożądany wynik nie zostanie osiągnięty, ponieważ interpreter uzna $sport1 za część zmiennej o nazwie $sport1bol, która nie istnieje.

    Aby wyraźnie wskazać interpreterowi, gdzie kończy się nazwa zmiennej, musisz umieścić nazwę zmiennej w nawiasach klamrowych:

    $sport1 = "będzie"; $sport2 = "stopa"; echo "Lubię ($sport1)bol i ($sport2)bol.";

    Znak dolara można umieścić przed lub za nawiasem klamrowym:

    $sport1 = "będzie"; $sport2 = "stopa"; echo "Lubię $(sport1)bol i ($sport2)bol.";

    Powiązanie

    Konkatenacja to łączenie dwóch lub więcej ciągów w jeden duży ciąg. Scalanie odbywa się za pomocą operatora konkatenacji - . (kropka). Podczas konkatenacji każdy kolejny wiersz jest dodawany na końcu poprzedniego:

    Wartość dowolnego typu, która jest połączona z ciągiem, zostanie niejawnie przekonwertowana na ciąg, a następnie połączona:

    "; echo "Numer: " . 1; ?>