Poslední diskuse jazyk PHP na habré se více omezuje na schopnost navrhovat složité systémy, což je dobrá zpráva. Po přezkoumání tuctu nejuznávanějších webových frameworků (Zend Framework, Adept, CakePHP, CodeIgniter, LIMB, Symfony, MZZ a další) jsem byl však skutečně překvapen, když jsem našel některé významné nedostatky z hlediska elementární optimalizace.

Aby toto téma bylo více technicky zaměřené, jsou výsledky prezentovány ve strohější podobě, což může vnímání poněkud zkomplikovat.

Takže, jdeme na to... Úkol je velmi jednoduchý: provést experimenty s rychlostí vytváření řetězců z podřetězců v jednoduchých a dvojitých uvozovkách. V zásadě bude tato otázka stále aktuální na dlouhou dobu kvůli zvláštnostem zpracování řetězců v PHP.

Existuje mnoho článků o základní optimalizaci skriptů jak v ruštině, tak v jiných jazycích. Málo se mluví o řetězcích, ale skutečnost "parsování" řetězců ve dvojitých uvozovkách pro proměnné a řídicí znaky je zaznamenána (nicméně jako v oficiální dokumentaci). Na základě toho je logické předpokládat, že používání řetězců v uvozovkách při práci bude poněkud pomalejší než stejné operace s podřetězci v jednoduchých uvozovkách.

Kromě nahrazování proměnných do řetězců a zřetězení proměnných s podřetězci implementuje PHP ještě alespoň jeden způsob vytváření řetězců: práci s funkcí sprintf. To je logické předpokládat tato metoda bude výrazně horší než ty "standardní" kvůli zvláštnímu volání funkce a analýze řetězců uvnitř.

Jediný dodatek, než vám představím kód testovacího skriptu: musíte zvážit 2 možné možnosti práce s řetězci v uvozovkách: s ohledem na jednoduchý a „pokročilý“ styl kódování. To, že jsou proměnné na samém začátku řádků, asi nemá cenu věnovat pozornost - jsou to pouze příklady:
$string = "$_SERVER["HTTP_HOST"] není správou Uljanovské oblasti. Milujeme ruský jazyk a nemáme rádi ty, kteří jím mluví..."
a
$string = "($_SERVER["HTTP_HOST")]) není správou Uljanovské oblasti. Milujeme ruský jazyk a nemáme rádi ty, kteří jím mluví..."

Test číslo jedna.
No, zdá se, že všechny výhrady byly učiněny – je čas ukázat výsledky práce. Zdroj tester lze nalézt.

Screenshoty ukazují, že moje hypotéza se nepotvrdila. Předpoklad o práci s řetězci přes sprintf se ukázal jako jediný správný. Nejrychlejší byly funkce, se kterými se pracuje dvojité uvozovky.

Po krátkém zamyšlení nad situací přišlo vysvětlení samo: podstatou je, že referenční řetězec, do kterého byly substituce provedeny, je příliš krátký: analyzátor procházející takovým řetězcem je maličkost. I zde je však zřejmé, že nativní substituce proměnné do řetězce dává výhodu oproti „pokročilému stylu“.
To je také slabina přístupu zřetězení: objem vložených dat převyšuje objem podřetězců. Odkud pochází režie, se dočtete v již zmíněném habratopiku.

I tyto myšlenky však bylo potřeba potvrdit. K tomu byl zapotřebí druhý test se změnami zmíněných možných důvodů takového nepředvídatelného (pro mě) chování. V páté verzi bylo zjevně upraveno mnoho věcí (přiznám se, že v páté verzi php jsem provedl pouze 1 test: obejít prvky pole).

Test číslo dvě.
Druhou hypotézou je, že prodloužení referenčního řetězce nakonec zvýší procento funkcí testeru spojených s vytvářením řetězců v uvozovkách ve srovnání s výsledky testu číslo 1. Stejná situace by teoreticky měla být pozorována s ohledem na operaci funkce sprintf. To je způsobeno především potřebou analýzy řetězců a zvýšením času stráveného nad tím. V situaci se zřetězením podřetězců v jednoduchých uvozovkách si myslím, že výsledek bude přibližně stejný jako v prvním testu, což způsobí mírné snížení podílu doby provádění funkce quotes_3() o čas. celého skriptu (ale žádné zvýšení výkonu).

Závěry jsou ve skutečnosti pouze pozitivní a potvrzující hypotézu. Když je referenční řetězec mírně zvýšen, dochází k velkému zatížení, což vede k poklesu výkonu funkcí dvojitých uvozovek a sprintf.

Předpoklad o řetězcích v jednoduchých uvozovkách se také ukázal jako správný: místo 36,75 % času v prvním testu zabrala funkce quotes_3() ve druhém 33,76 % času provádění skriptu.

praktickou hodnotu.
Jednoduše řečeno, abstrahujeme od dat, můžeme dojít k závěru: co delší řetězec, ve kterém je nutné provést substituci, tím je pravděpodobnější, že operace zřetězení bude dokončena rychleji než hledání proměnné v uvozovkách. Dobrovolníci se mohou pokusit zvolit potřebné parametry vkládání (počet proměnných, délka referenčního řetězce, délky řetězců v proměnných) tak, aby splňovaly rovnost časů provádění.

To je ve skutečnosti vše. Zbývá jen dodat, že v programování nejsou žádné maličkosti (to je pro ty, kteří rádi říkají „úspora na zápasy“ (c) Adelf). Když znáte takové jemnosti a vezmete je v úvahu, můžete napsat kód, který bude optimalizován na všech jeho úrovních;)

PS:
Testy provedené pomocí Zend Studio For Eclipse 6.0.0 (včetně Debuggeru a Profileru).
Verze PHP 5.2.5
OS Debian Linux

PPS:
Byl bych rád, kdyby někdo zveřejnil výsledky těchto testů. Myslím, že to umožní objektivnější posouzení potřeby použití té či oné metody substituce do řetězců. Byl bych také vděčný za zdravou kritiku stylu prezentace a designu.

(PHP 4, PHP 5, PHP 7)

str_replace- Nahradí všechny výskyty hledaného řetězce náhradním řetězcem

Popis

Tato funkce vrací řetězec nebo pole se všemi výskyty hledání v předmětu nahrazenými nahrazením .

Pokud nepotřebujete složitá pravidla hledání/nahrazování (jako jsou regulární výrazy), je tato funkce vhodnější. preg_replace().

Seznam parametrů

Pokud jsou hledání a nahrazování pole, pak str_replace() používá každou hodnotu z odpovídajícího pole k vyhledání a nahrazení v předmětu . Pokud je v nahrazovaném poli méně prvků než ve vyhledávání, bude prázdný řetězec použit jako náhradní řetězec pro zbývající hodnoty. Pokud je hledání pole a nahrazení je řetězec, pak tento náhradní řetězec bude použit pro každý prvek vyhledávacího pole. Opačný případ nedává smysl.

Pokud jsou pole hledat nebo nahrazovat, jejich prvky budou zpracovány od prvního do posledního.

Hodnota, kterou hledáte, známá také jako jehla(jehla). Pole můžete použít pro více vyhledávacích hodnot.

Nahradit

Nahrazující hodnota bude použita k nahrazení hledaných hledaných hodnot. Pole můžete použít pro více hodnot.

předmět

Řetězec nebo pole, které se má vyhledat a nahradit, známé také jako kupka sena(hromada sena).

Pokud je předmět pole, pak se vyhledávání a nahrazování provede u každého prvku předmětu a výsledkem funkce bude také pole.

Pokud projde, bude nastaven na počet provedených výměn.

Návratové hodnoty

Tato funkce vrátí řetězec nebo pole s nahrazenými hodnotami.

Příklady

Příklad č. 1 Příklady použití str_replace()

// přiřadí
$bodytag = str_replace("%body%" , "black" , " " );

// přiřadit: Hll Wrld f PHP
$samohlásky = array("a" , "e" , "i" , "o" , "u" , "A" , "E" , "I" , "O" , "U" );
$onlyconsonants = str_replace ($samohlásky , "" , "Ahoj světe PHP" );

// přiřadí: Měli byste jíst pizzu, pivo a zmrzlinu každý den
$phrase = "Měli byste jíst ovoce, zeleninu a vlákninu každý den.";
$healthy = array("ovoce" , "zelenina" , "vláknina" );
$yummy = array("pizza" , "pivo" , "zmrzlina" );

$newphrase = str_replace ($healthy , $yummy , $phrase );

// přiřadit: 2
$str = str_replace ("ll" , "" , "dobrá slečno molly!" , $count );
echo $počet ;
?>

Příklad č. 2 Příklady potenciálních triků s str_replace()

// Objednávka výměny
$str = "Řádek 1\nŘádek 2\rŘádek 3\r\nŘádek 4\n";
$pořadí = pole("\r\n" , "\n" , "\r" );
$nahradit = "
" ;

// Nejprve zpracovává \r\n, aby se zabránilo jejich opětovnému nahrazení.
echo $newstr = str_nahradit ($objednavka , $nahradit , $str );

// Výstupy F, protože A je nahrazeno B, pak B C a tak dále...
// V důsledku toho bude E nahrazeno F, protože nahrazení probíhá zleva doprava.
$search = array("A" , "B" , "C" , "D" , "E" );
$nahradit = array("B" , "C" , "D" , "E" , "F" );
$předmět = "A" ;
echo str_replace ($hledat , $nahradit , $předmět );

// Výstupy: jablko, ořech, ořech (z výše uvedeného důvodu)
$písmena = pole("I" , "o" );
$ovoce = array("jablko" , "ořech" );
$text = "Chystám se" ;
$output = str_replace ($písmena , $ovoce , $text );
echo $výstup ;
?>

Poznámky

Komentář: Tato funkce je bezpečná pro práci s daty v binární podobě.

Varování

Poznámka k objednávce výměny

Protože str_replace() nahradí zleva doprava, pak při použití více záměn může nahradit dříve vloženou hodnotu jinou. Viz také příklady na této stránce.

Komentář:

Tato funkce rozlišuje malá a velká písmena. Použití str_place() pro náhradu nerozlišující malá a velká písmena.

Komentář: V PHP 7.0.0 na 64bitových platformách není dosažitelný limit délky řetězce, na 32bitových systémech a dřívějších verzích PHP nesmí být řetězce větší než 2 GB (2147483647 bajtů).

Syntax

Řetězec může být definován čtyřmi různé způsoby:

  • jednoduché uvozovky
  • dvojité uvozovky
  • syntaxe nowdoc (od PHP 5.3.0)

Jednoduché uvozovky

Nejjednodušší způsob definovat řetězec znamená uzavřít jej do jednoduchých uvozovek (symbol " ).

Chcete-li v řetězci použít jednu uvozovku, uzavřete ji zpětným lomítkem ( \ ). Pokud potřebujete napsat zpětné lomítko samotné, zkopírujte jej ( \\ ). Všechna ostatní zpětná lomítka budou interpretována jako běžné znaky, což znamená, že pokud se pokusíte použít jiné escape sekvence jako např. \r nebo \n, budou vystupovat tak, jak jsou, namísto jakéhokoli zvláštního chování.

echo "toto je jednoduchý řetězec";

echo „Také můžete vkládat do řádků
postava z nového řádku, jako je tato,
to je normální"
;

// Výstupy: Jednoho dne Arnold řekl: "Vrátím se"
echo "Jednoho dne Arnold řekl: "Vrátím se"";

echo "Smazali jste C:\\*.*?";

// Výstupy: Smazali jste C:\*.*?
echo "Smazali jste C:\*.*?" ;

// Výstup: Toto nebude rozbaleno: \n nový řádek
echo "Toto se nerozbalí: \n nový řádek";

// Tiskne: $expand proměnné také nejsou rozbaleny o $ani
echo "Proměnné $expand také $either nejsou expandovány";
?>

Dvojité uvozovky

Pokud je řetězec uzavřen do dvojitých uvozovek ("), PHP rozpozná následující speciální sekvence escape znaků:

Únikové sekvence
Subsekvence Význam
\n nový řádek (LF nebo 0x0A (10) v ASCII)
\r návrat vozíku (CR nebo 0x0D (13) v ASCII)
\t horizontální karta (HT nebo 0x09 (9) v ASCII)
\proti vertikální karta (VT nebo 0x0B (11) v ASCII) (od PHP 5.2.5)
\E znak escape (ESC nebo 0x1B(27) v ASCII) (od PHP 5.4.4)
\F seznam stránek (FF nebo 0x0C (12) v ASCII) (od PHP 5.2.5)
\\ obrácené lomítko
\$ znak dolaru
\" dvojitá citace
\{1,3} posloupnost znaků odpovídající regulárnímu výrazu znaku v osmičkové soustavě, který tiše přeteče, aby se vešel do bajtu (tj. "\400" === "\000")
\x(1,2) posloupnost znaků, která odpovídá regulárnímu výrazu znaků v šestnáctkové soustavě
\u(+) sekvence znaků odpovídajících regulárnímu výrazu znaků Unicode, který se mapuje na řetězec v reprezentaci UTF-8 (přidáno v PHP 7.0.0)

Stejně jako u řetězce uzavřeného v jednoduchých uvozovkách, escapování jakéhokoli znaku také vytiskne samotný znak escape. Před PHP 5.1.1 zpětné lomítko in \($var) nevytištěno.

Heredoc

Třetím způsobem, jak definovat řetězce, je použití syntaxe heredoc: <<< . Po tomto příkazu musíte zadat identifikátor a poté nový řádek. Poté následuje samotný řádek a poté stejný identifikátor, který uzavírá vložku.

Čára musí začít uzavíracím identifikátorem, tzn. měl by být v prvním sloupci řádku. Kromě toho musí identifikátor splňovat stejné konvence pojmenování jako všechny ostatní značky PHP: obsahovat pouze alfanumerické znaky a podtržítka a nesmí začínat číslem (podtržítka jsou povolena).

Pozornost

Je velmi důležité si uvědomit, že řetězec s koncovým identifikátorem nesmí obsahovat jiné znaky, kromě středníku ( ; ). To znamená, že ID nesmí být odsazené a že před ani za středníkem nesmí být žádné mezery ani tabulátory. Je také důležité pochopit, že první znak před koncovým identifikátorem musí být znak nového řádku, jak je definováno vaším operačním systémem. Například na systémech UNIX, včetně macOS, je tomu tak \n. Za koncovým identifikátorem musí také bezprostředně následovat nový řádek.

Pokud je toto pravidlo porušeno a koncový identifikátor není „čistý“, má se za to, že žádný uzavírací identifikátor neexistuje a PHP jej bude dále hledat. Pokud se v tomto případě nikdy nenajde správný uzavírací identifikátor, způsobí to chybu analýzy s číslem řádku na konci skriptu.

Beispiel #1 Příklad nesprávné syntaxe

třída foo(
veřejný $bar =<<bar
EOT;
// odsazení před koncovým identifikátorem není povoleno
}
?>

Beispiel #2 Příklad správné syntaxe

třída foo(
veřejný $bar =<<bar
EOT;
}
?>

Heredoc nelze použít k inicializaci polí třídy. Od PHP 5.3 se toto omezení týká pouze heredoců, které v sobě obsahují proměnné.

Text Heredoc se chová stejně jako řetězec s dvojitými uvozovkami, aniž by je měl. To znamená, že nemusíte v heredoc uvozovat uvozovky, ale stále můžete použít výše uvedené sekvence escape. S proměnnými se pracuje, ale při používání složitých proměnných uvnitř heredocu musíte být stejně opatrní jako při práci s řetězci.

Příklad definice řetězce Beispiel #3 heredoc

$str =<<Příklad linky,
přesahující více řádků
pomocí syntaxe heredoc.
EOD;

Třída foo
{
var $foo ;
var $bar ;

Funkce __construct()
{
$this -> foo = "foo" ;
$toto ->
}
}

$foo = newfoo();
$jméno = "Jméno" ;

echo<<Jmenuji se " $jméno ". Píšu $foo -> foo .
Teď vyndám
( $foo -> bar [ 1 ]) .
Výsledkem by mělo být velké písmeno "A": \x41
EOT;
?>

Jmenuji se "Jméno". Píšu Foo. Nyní vypisuji Bar2. Výsledkem by mělo být velké písmeno "A": A

Je také možné použít syntaxi heredoc k předání dat prostřednictvím argumentů funkce:

Od verze 5.3.0 je možné inicializovat statické proměnné a vlastnosti/konstanty třídy pomocí syntaxe heredoc:

Beispiel #5 Použití heredoc k inicializaci statických proměnných

// Statické proměnné
functionfoo()
{
statický $bar =<<Nic tu není...
označení;
}

// Konstanty/vlastnosti třídy
třída foo
{
const BAR =<<Příklad použití konstanty
FOOBAR;

Veřejná $základ =<<Příklad použití v terénu
FOOBAR;
}
?>

Od PHP 5.3.0 je také možné umístit identifikátor Heredoc do dvojitých uvozovek:

Nowdoc

Nowdoc je stejný pro řetězce v jednoduchých uvozovkách jako heredoc pro řetězce s dvojitými uvozovkami. Nowdoc je podobný jako heredoc, ale uvnitř nejsou prováděny žádné náhrady. Tato konstrukce je ideální pro vkládání kódu PHP nebo jiných velkých bloků textu, aniž byste jej museli escapovat. V tomto je trochu podobný konstruktu SGML. prohlášením bloku textu, který není určen ke zpracování.

Nowdoc je označen stejnou sekvencí <<< , který se používá v heredoc, ale identifikátor, který za ním následuje, je uzavřen v jednoduchých uvozovkách, např. <<<"EOT" . Všechny podmínky, které se vztahují na identifikátory heredoc, se vztahují také na nowdoc, zejména ty, které se vztahují na uzavírací identifikátor.

Beispiel #7 nowdoc příklad

echo<<<"EOD"
textový příklad,
přesahující více řádků
pomocí syntaxe nowdoc. S zpětnými lomítky se vždy zachází doslova,
například \\ a \".
EOD;

Výsledek spuštění tohoto příkladu:

Příklad textu zahrnujícího více řádků pomocí syntaxe nowdoc. Zpětná lomítka jsou vždy zpracována doslova, jako \\ a \".

Příklad č. 8 Příklad citování řetězce Nowdoc s proměnnými

/* Složitější příklad s proměnnými. */
třída foo
{
veřejné $foo ;
veřejný $bar ;

Funkce __construct()
{
$this -> foo = "foo" ;
$this -> bar = array("Bar1" , "Bar2" , "Bar3" );
}
}

$foo = newfoo();
$jméno = "Jméno" ;

echo<<<"EOT"
Jmenuji se "$name". Píšu $foo->foo.
Teď píšu ($foo->bar).
To by nemělo vypsat velké "A": \x41
EOT;
?>

Výsledek spuštění tohoto příkladu:

Jmenuji se "$name". Píšu $foo->foo. Teď píšu ($foo->bar). To by nemělo vypsat velké "A": \x41

Příklad č. 9 Příklad statických dat

třída foo(
veřejný $bar =<<<"EOT"
bar
EOT;
}
?>

Komentář:

Podpora nowdoc byla přidána do PHP 5.3.0.

Zpracování proměnných

Pokud je řetězec zadán v uvozovkách nebo s heredoc, zpracují se proměnné uvnitř něj.

Existují dva typy syntaxe: jednoduchá a složitá. Jednoduchá syntaxe je jednodušší a pohodlnější. Umožňuje zpracovat proměnnou, hodnotu pole ( pole) nebo vlastnosti objektu ( objekt) s minimálním úsilím.

Složitou syntaxi lze identifikovat podle složených závorek obklopujících výraz.

Jednoduchá syntaxe

Pokud tlumočník narazí na znak dolaru ( $ ), zachytí co nejvíce znaků, aby vytvořil správný název proměnné. Pokud chcete zadat konec názvu, uzavřete název proměnné do složených závorek.

$džus = "jablko" ;

echo "Vypil nějaký $džusový džus." . PHP_EOL ;

// Špatně. "s" je platný znak pro název proměnné, ale název proměnné je $džus.
echo "Vypil nějaký džus vyrobený z $džusů." ;

// Správně. Konec názvu proměnné je přesně specifikován pomocí hranatých závorek:
echo "Vypil nějaký džus vyrobený z $( džusu ) s." ;
?>

Výsledek spuštění tohoto příkladu:

Vypil trochu jablečného džusu. Vypil trochu připravené šťávy. Vypil trochu jablečného džusu.

Prvek pole ( pole) nebo vlastnost objektu ( objekt). V indexech pole je uzavírací hranatá závorka ( ] ) označuje konec definice indexu. Pro vlastnosti objektu platí stejná pravidla jako pro jednoduché proměnné.

Příklad #10 Jednoduchý příklad syntaxe

define("KOOLAID" , "koolaid1" );
$juices = array("jablko" , "oranžová" , "koolaid1" => "fialová" );

echo "Vypil nějaké $džusy [ 0 ] džusu." . PHP_EOL ;
echo "Vypil nějaké $džusy [ 1 ] džus." . PHP_EOL ;
echo "Vypil nějaké $džusy [ koolaid1 ] džus." . PHP_EOL ;

třídní lidé (
public $john = "Jan Smith" ;
public $jane = "Jane Smith" ;
public $robert = "Robert Paulsen" ;

Veřejné $kovář = "Kovář" ;
}

$people = noví lidé();

echo " $people -> John vypil $džusy [ 0 ] džus." . PHP_EOL ;
echo " $people -> john pak pozdravil $people -> jane ." . PHP_EOL ;
echo " $people -> manželka Jana pozdravila $people -> robert." . PHP_EOL ;
echo " $people -> robert pozdravil dva $people -> kováři." ; // Nefunguje
?>

Výsledek spuštění tohoto příkladu:

Vypil trochu jablečného džusu. Vypil trochu pomerančového džusu. Vypil trochu fialového džusu. John Smith vypil trochu jablečného džusu. John Smith pak řekl ahoj Jane Smith. Manželka Johna Smithe pozdravila Roberta Paulsena a Robert Paulsen ty dva pozdravil.

PHP 7.1.0 přidána podpora negativníčíselné indexy.

Příklad č. 11 Záporné číselné indexy

$string = "řetězec" ;
echo "Znak na indexu -2 je$string [- 2 ] ." , PHP_EOL ;
$string [- 3 ] = "o" ;
echo "Změnou znaku na pozici -3 na "o" vznikne následující řádek:$string ." , PHP_EOL ;
?>

Výsledek spuštění tohoto příkladu:

Znak s indexem -2 je n. Změnou znaku na pozici -3 na "o" vznikne následující řetězec: silný

Pro cokoliv složitějšího použijte komplexní syntaxi.

Složitá (složená) syntaxe

Nazývá se složitým ne proto, že je obtížné mu porozumět, ale proto, že umožňuje použití složitých výrazů.

Jakákoli skalární proměnná, prvek pole nebo vlastnost objektu namapovaná na řetězec mohou být reprezentovány v řetězci s touto syntaxí. Stačí napsat výraz stejně jako mimo řetězec a poté jej uzavřít { a } . Protože { nelze escapovat, tato syntaxe bude rozpoznána pouze tehdy $ následuje bezprostředně po { . Použití {\$ vytisknout {$ . Několik názorných příkladů:

// Zobrazit všechny chyby
error_reporting(E_ALL);

$skvělý = "skvělý" ;

// Nefunguje, výstupy: Toto (skvělé)
echo "To je ( $skvělý )" ;

// Práce, výstupy: To je skvělé
echo "To je ($skvělé)" ;

// Funguje
echo „Tohle náměstí je široké( $čtverec -> šířka ) 00 centimetrů." ;

// Funguje, klíče v uvozovkách fungují pouze se syntaxí složených závorek
echo "Funguje to: ( $arr [ "klíč" ]) " ;

// Funguje
echo "Funguje to: ( $arr [ 4 ][ 3 ]) " ;

// Toto je špatné ze stejného důvodu, proč je $foo mimo
// řádky. Jinými slovy, bude to stále fungovat
// ale protože PHP nejprve hledá konstantu foo, toto zavolá
// Chyba úrovně E_NOTICE (nedefinovaná konstanta).
echo "Není to správné:( $arr [ foo ][ 3 ]) " ;

// Funguje. Při použití vícerozměrných polí uvnitř
// řetězce vždy používají složené závorky
echo "Funguje to: ( $arr [ "foo" ][ 3 ]) " ;

// Funguje.
echo "Funguje to: ". $arr [ "foo" ][ 3 ];

echo "Také to funguje:( $obj -> hodnoty ​​[ 3 ]-> jméno ) ";

echo "Toto je hodnota pojmenované proměnné$jméno : ($( $jméno)) ";

echo "Toto je hodnota proměnné podle názvu, kterou vrací funkce getName():($( getName ())) ";

echo "Toto je hodnota proměnné podle názvu vrácená funkcí \$object->getName():($( $object -> getName ())) ";

// Nefunguje, výstupy: GetName() vrací toto: (getName())
echo "Toto vrací getName(): (getName())";
?>

Pomocí této syntaxe je také možné přistupovat k vlastnostem objektů v řetězcích.

třída foo(
var $bar = "Jsem bar." ;
}

$foo = newfoo();
$bar = "bar" ;
$baz = array("foo" , "bar" , "baz" , "quux" );
echo " ( $foo -> $bar ) \n" ;
echo " ( $foo ->( $baz [ 1 ])) \n" ;
?>

Výsledek spuštění tohoto příkladu:

Jsem bar. Jsem bar.

Komentář:

Funkce, volání metod, statické proměnné třídy a konstanty třídy fungují interně {$} , od verze PHP 5. Zadaná hodnota však bude považována za název proměnné ve stejném kontextu jako řetězec, ve kterém je definována. Použití jednoduchých složených závorek ( {} ) nebude fungovat pro přístup k hodnotám funkcí, metod, konstant třídy nebo statických proměnných třídy.

// Zobrazit všechny chyby
error_reporting(E_ALL);

třídní piva (
const softdrink = "kořenové pivo" ;
public static $ale = "ipa" ;
}

$rootbeer = "A & W" ;
$ipa = "Alexander Keith\"s" ;

// Funguje to, výstupy: Chtěl bych A & W
echo "Rád bych ($( piva :: nealkoholický nápoj )) \n" ;

// To také funguje, výstupy: Chtěl bych Alexandra Keitha
echo "Rád bych ($( piva :: $ale )) \n" ;
?>

Přístup ke znaku v řetězci a jeho změna

Znaky v řetězcích lze použít a upravit zadáním jejich posunutí od začátku řetězce, počínaje nulou, v hranatých závorkách za řetězcem, například $str . Představte si řetězec pro tento účel jako pole znaků. Pokud potřebujete získat nebo nahradit více než 1 znak, můžete použít funkce substr() a substr_replace().

Komentář: od PHP 7.1.0 jsou podporovány záporné hodnoty offsetu. Nastavují odsazení od konce řetězce. Dříve záporné odchylky způsobovaly chybu úrovně E_NOTICE při čtení (vrácení prázdného řetězce) popř E_VAROVÁNÍ při zápisu (ponechání řetězce beze změny).

Komentář: Ke znaku v řetězci lze také přistupovat pomocí složených závorek, jako je $str(42) .

Pozornost

Pokus o zápis do offsetu mimo řetězec vyplní řetězec mezerami až do tohoto offsetu. Neceločíselné typy budou převedeny na celá čísla. Nesprávný typ offsetu způsobí chybu úrovně E_VAROVÁNÍ. Použije se pouze první znak přiřazeného řetězce. Od PHP 7.1.0 způsobí přiřazení prázdného řetězce fatální chybu. Dříve byl v tomto případě přiřazen nulový bajt (NULL).

Pozornost

Řetězce v PHP jsou interně pole bajtů. Výsledkem je, že přístup k řetězci nebo jeho úprava pomocí offsetu není vícebajtový bezpečný a měl by být prováděn pouze s řetězci v jednobajtovém kódování, jako je ISO-8859-1.

Komentář: Od PHP 7.1.0 způsobuje použití prázdného indexu fatální chybu, dříve v takovém případě byl řetězec bez varování převeden na pole.

Příklad #12 Několik příkladů řetězců

// Získá první znak řetězce
$str = "Toto je test." ;
$first = $str [ 0 ];

// Získá třetí znak řetězce
$třetina = $str [ 2 ];

// Získání posledního znaku řetězce
$str = "Toto je stále test." ;
$poslední = $str [ strlen($str )- 1 ];

// Změna posledního znaku řetězce
$str = "Podívejte se na moře" ;
$str [ strlen ($str )- 1 ] = "e" ;

?>

Od PHP 5.4 musí být offset v řetězci buď celé číslo nebo řetězec obsahující čísla, jinak bude vydáno varování. Dříve offset daný řetězcem jako "foo", byl bez varování převeden na 0 .

Příklad #13 Rozdíly mezi PHP 5.3 a PHP 5.4

$str = "abc" ;

Var_dump($str["1"]);
var_dump (isset($str [ "1" ]));

Var_dump($str[ "1.0" ]);
var_dump (isset($str [ "1.0" ]));

Var_dump($str["x"]);
var_dump (isset($str [ "x" ]));

Var_dump($str[ "1x" ]);
var_dump (isset($str [ "1x" ]));
?>

Výsledek spuštění tohoto příkladu v PHP 5.3 je:

string(1) "b" bool(true) string(1) "b" bool(true) string(1) "a" bool(true) string(1) "b" bool(true)

Výsledek spuštění tohoto příkladu v PHP 5.4 je:

string(1) "b" bool(true) Varování: Neplatný posun řetězce "1.0" v /tmp/t.php na řádku 7 string(1) "b" bool(false) Varování: Neplatný posun řetězce "x" v / tmp/t.php na řádku 9 string(1) "a" bool(false) string(1) "b" bool(false)

Komentář:

Pokus o přístup k proměnným jiných typů (kromě polí nebo objektů, které implementují určitá rozhraní) pomocí nebo {} tiše vrátit NULA.

Komentář:

PHP 5.5 přidalo podporu pro přístup ke znakům v řetězcových literálech pomocí syntaxe nebo {} .

Existuje mnoho užitečných funkcí pro úpravu řetězců.

Hlavní funkce jsou popsány v části funkce řetězců a pro pokročilé vyhledávání a nahrazování funkce regulárních výrazů kompatibilní s Perl.

Převést na řetězec

Hodnotu lze převést na řetězec pomocí přetypování (tětiva), nebo funkce strval(). Ve výrazech, kde je potřeba řetězec, proběhne převod automaticky. K tomu dochází, když používáte funkce echo nebo tisk, nebo když je hodnota proměnné porovnána s řetězcem. Přečtením částí příručky Typy a Manipulace s typy bude následující jasnější. viz také settype().

Pole jsou vždy převedeny na řetězec "pole", takže nemůžete zobrazit obsah pole ( pole) použitím echo nebo tisk abyste viděli, co obsahuje. Chcete-li zobrazit jednotlivý prvek, použijte něco jako echo $arr["foo"]. Níže naleznete tipy, jak zobrazit/zobrazit veškerý obsah.

Chcete-li převést proměnnou typu "Objekt" podle typu tětiva používá se magická metoda __toString.

Význam NULA vždy převedeny na prázdný řetězec.

Jak můžete vidět výše, přímá stringizace polí, objektů nebo zdrojů neposkytuje žádné užitečné informace o hodnotách samotných, kromě jejich typů. Vhodnějším způsobem výstupu hodnot pro ladění je použití funkcí print_r() a var_dump().

Většinu hodnot v PHP lze převést na řetězec pro trvalé uložení. Tato metoda se nazývá serializace a lze ji provést pomocí funkce serializovat ().

Převod řetězců na čísla

Pokud je řetězec rozpoznán jako číselná hodnota, výsledná hodnota a typ se určí následovně.

Pokud řetězec neobsahuje žádný ze znaků ".", "e" nebo "E" a hodnota čísla se vejde do rozsahu celých čísel (definováno PHP_INT_MAX), bude řetězec rozpoznán jako celé číslo ( celé číslo). Ve všech ostatních případech se považuje za číslo s pohyblivou řádovou čárkou ( plovák).

Hodnota je určena počáteční částí řetězce. Pokud řetězec začíná platnou číselnou hodnotou, použije se tato hodnota. Jinak bude hodnota 0 (nula). Platná číselná hodnota je jedna nebo více číslic (které mohou obsahovat desetinnou čárku), před kterými může být znaménko, za kterým následuje volitelný exponent. Exponent je "e" nebo "E" následovaný jednou nebo více číslicemi.

$foo = 1 + "10,5" ; // $foo je plovoucí (11.5)
$foo = 1 + "-1,3e3" ; // $foo je plovoucí (-1299)
$foo = 1 + "bob-1.3e3" ; // $foo je celé číslo (1)
$foo = 1 + "bob3" ; // $foo je celé číslo (1)
$foo = 1 + "10 malých prasat" ; // $foo je celé číslo (11)
$foo = 4 + "10.2 Malá prasátka" ; // $foo je plovoucí (14.2)
$foo = "10,0 prasat" + 1 ; // $foo je plovák (11)
$foo = "10,0 prasat" + 1,0 ; // $foo je plovák (11)
?>

Více informací o této konverzi najdete v části strtod(3) v dokumentaci k Unixu.

Pokud chcete otestovat některý z příkladů v této části, zkopírujte jej a vložte jej a následující řádek, abyste viděli, co se stane:

echo "\$foo== $foo ; napište: " . gettype ($foo) . "
\n" ;
?>

Neočekávejte, že kód znaku získáte převodem na celé číslo (jak se to dělá například v C). Chcete-li převést znaky na jejich kódy ASCII a naopak, použijte funkce ord() a chr().

Podrobnosti implementace typu řetězce

před 7 lety

Dokumentace to nezmiňuje, ale závěrečný středník na konci heredoc je ve skutečnosti interpretován jako skutečný středník a jako takový někdy vede k syntaktickým chybám.

$foo =<<abeceda
KONEC;
?>

Toto neplatí:

foo(<<abeceda
KONEC;
);
// chyba syntaxe, neočekávané ";"
?>

Bez středníku to funguje dobře:

foo(<<abeceda
KONEC
);
?>

před 3 lety

Můžete použít řetězec jako pole znaků (jako C)

$a = "Test pole řetězců";

var_dump($a);
// Návrat string(17) "Test pole řetězců"

var_dump($a);
// Návrat řetězec(1) "S"

// -- S přetypováním pole --
var_dump((pole)$a);
// Návrat pole(1) ( => string(17) "Test pole řetězců")

var_dump((pole)$a);
// Návrat string(17) "S"

Norihiori

před 15 lety

Pomocí složité syntaxe můžete vložit hodnotu obou vlastností objektu A metod objektu do řetězce. Například...
třídní test(
veřejné $jedna = 1 ;
veřejná funkce dvě()(
návrat 2;
}
}
$test = new Test();
echo "foo ( $test -> jeden ) pruh ( $test -> dva ()) " ;
?>
Bude vydávat „foo 1 bar 2“.

Nemůžete to však udělat pro všechny hodnoty ve vašem jmenném prostoru. Konstanty třídy a statické vlastnosti/metody nebudou fungovat, protože složitá syntaxe hledá "$".
třídní test(
const JEDNA = 1 ;
}
echo "foo (Test::ONE) bar" ;
?>
Výsledkem bude "foo (Test::one) bar". Konstanty a statické vlastnosti vyžadují, abyste řetězec přerušili.

před 3 lety

Pozor, v souladu s „Převod řetězce na čísla“:

If ("123abc" == 123 ) echo "(intstr == int) nesprávně testuje jako pravdivé.";

// Protože jedna strana je číslo, řetězec je nesprávně převeden z intstr na int, který pak odpovídá testovacímu číslu.

// Platí pro všechny podmínky, jako jsou příkazy if a switch (pravděpodobně také cykly while)!

// To by mohlo být obrovské bezpečnostní riziko při testování/používání/ukládání uživatelského vstupu, zatímco očekáváte a testujete pouze celé číslo.

// Zdá se, že jedinou opravou je, aby 123 byl řetězec jako "123", takže nedojde k žádné konverzi.

?>

před 6 lety

Počáteční nuly v řetězcích nejsou (nejmenší překvapení) považovány za osmičkové.
Zvážit:
$x = "0123" + 0;
$y = 0123 + 0;
echo "x je $x, y je $y"; //vytiskne "x je 123, y je 83"
jinými slovy:
* úvodní nuly v číselných literálech ve zdrojovém kódu jsou interpretovány jako "osmičkové", srov. strtol().
* úvodní nuly v řetězcích (např. data odeslaná uživatelem) jsou při přetypování (implicitně nebo explicitně) na celé číslo ignorovány a považovány za desítkové, srov. strtod().

před 10ti lety

Zde je snadný hack, který umožní řetězcům a heredocům ve dvojitých uvozovkách obsahovat libovolné výrazy v syntaxi složených závorek, včetně konstant a dalších volání funkcí:

// Prohlášení o hacku
function_expr ($v) ( return $v ; )
$_expr = "_expr" ;

// Naše hřiště
definovat("qwe" , "asd");
definovat("zxc", 5 );

$a= 3 ;
$ b= 4 ;

funkce C($a, $ b) (vrátit se$a+ $ b; }

// Použití
echo"před{ $_expr(1 + 2 )} příspěvek\n"; // výstupy "pre 3 post"
echo"před{ $_expr(qwe)} příspěvek\n"; // výstupy "pre asd post"
echo"před{ $_expr(C($a, $ b)+ zxc* 2 )} příspěvek\n"; // výstupy "pre 17 post"

// Obecná syntaxe je ($_expr(...))
?>

Před 2 roky

Myslel jsem, že by bylo užitečné přidat tento komentář, aby se informace objevily alespoň na správné stránce na webu PHP.

Všimněte si, že pokud máte v úmyslu použít řetězec ve dvojitých uvozovkách s asociativním klíčem, můžete narazit na chybu T_ENCAPSED_AND_WHITESPACE. Někteří to považují za jednu z méně zjevných chybových zpráv.

Výraz jako:

$ovoce=array(
"A"=> "jablko",
"b"=> banán,
//atd
);

tisk "Toto je a$ovoce[ "A"]"; // T_ENCAPSED_AND_WHITESPACE
?>

se určitě rozpadne na kusy.

Můžete to vyřešit následovně:

tisk"Toto je a$ovoce[ A] " ; // zrušte citaci klíče
tisk"Toto je a${ ovoce[ "A"]} " ; // Složitá syntaxe
tisk"Toto je a{ $ovoce[ "A"]} " ; // Komplexní variace syntaxe
?>

Osobně preferuji poslední variantu, protože je přirozenější a blíže tomu, jaký by byl výraz mimo řetězec.

Není jasné (alespoň mně), proč PHP chybně interpretuje jedinou uvozovku uvnitř výrazu, ale myslím si, že to má něco společného s tím, že uvozovky nejsou součástí řetězce hodnot - jakmile je řetězec již analyzován, uvozovky prostě překážet…?

Před 2 roky

Obojí by mělo fungovat :(

třídatestování{
veřejná statika
$var= "statický";
public const VAR =
"konst";

veřejná funkce řekniHelloStatic() {
echo
Ahoj:{ $toto:: $var} " ;
}

veřejná funkce řekniHelloConst() {
echo
Ahoj:{ $toto::VAR)" ; //Chyba analýzy: chyba syntaxe, neočekávané ")", očekává se "["
}
}

$obj= novýtestování();
$obj-> řekniHelloStatic();
$obj-> řekniHelloConst();

před 3 lety

Něco, co jsem zažil, co bezpochyby někomu pomůže. . .
V mém editoru to zvýrazní syntaxi HTML a $comment:

$html =<<<"EOD"
$komentář
EOD;

Pomocí tohoto zobrazíte všechny stejné barvy:

$html =<<$komentář
EOD;

práce s ním je mnohem jednodušší

před 11 lety

Abyste si zachránili mysl, nečtěte předchozí komentáře o datech ;)

Když lze oba řetězce převést na numerické (v testu ("$a" > "$b")), použijí se výsledná numerická čísla, jinak se porovnávají FULL řetězce char-by-char:

var_dump("1.22" > "01.23" ); // bool(false)
var_dump("1.22.00" > "01.23.00" ); // bool(true)
var_dump("1-22-00" > "01-23-00" ); // bool(true)
var_dump((plovák)"1.22.00" > (plovoucí)"01.23.00" ); // bool(false)
?>



Tabulky:

C_id | společnost | umístění
1 | OOO Hledat | Kudykino hřiště 15/3
2 | CJSC Elita | Slunysvalinsk 133/7
3 | OJSC Pyshpyshch | Soldatodachestroyskoe 404

Typ opravy (repair_types)
r_id | typy_oprav |
1 | Kladivo + hřebíky
2 | Poradenství pro krásu
3 | Generální oprava

Seznam objednávek (seznam)
l_id | Kdo | Co je potřeba | čas | komentář operátora
1 | 1 | 2 | %timestamp% | %operator_text%
2 | 2 | 1 | | %text%
3 | 3 | 2 | | %text%

Tabulka č. 1 obsahuje seznam klientů.
Tabulka č. 2 obsahuje seznam služeb.
Tabulka č. 3 obsahuje seznam aktuálních zakázek pro operační týmy. Tato tabulka je pravidelně aktualizována a k jejímu vyplnění slouží webový formulář. Vzhledem k tomu, že přichází poměrně hodně objednávek, jsou do tabulky zapisovány záznamy ve formě ID klienta a služby.

Ve skutečnosti je problém v tom, že třetí tabulka by se měla zobrazovat ve webovém formuláři "výběr objednávky" a místo ID je potřeba dosadit odpovídající pole z jiných sloupců.

Kód:
$dotaz = "VYBRAT * ZE seznamu";
$vysledek = mysql_query($dotaz);
while($row=mysql_fetch_array($result. // získání výsledků z každého řádku
( echo "";// zobrazení dat
}




CREATE TABLE "table_name" ("id" int(255) NOT NULL AUTO_INCREMENT, text "list" (80) NOT NULL, PRIMARY KEY("id".

INSERT INTO "table_name" ("seznam") HODNOT ("bla-bla")



nejlepší odpověď $dotaz =
"
vybrat společnosti.Společnost, typy_oprav.Druhy_oprav, seznam.komentář_l
ze seznamu
vnitřní společnosti
na seznamu.Kdo = společnosti.c_id
typy oprav vnitřního spojení
na seznamu."Co je potřeba" = repair_types.r_id
";

Obrázky, zvukové soubory, video informace, data animací a applety samozřejmě tvoří důležitou část obsahu World Wide Web, ale velká většina dat na webu je stále ve formě textu – sekvencí znaků jako tato věta. Základním datovým typem PHP pro reprezentaci textu je řetězec.

Popis řetězců v PHP

Řetězce jsou sekvence znaků, se kterými lze zacházet jako s jednou entitou – přiřadit je proměnným, předat je jako vstup funkcím, vrátit je z funkcí nebo je odeslat jako výstup, které se zobrazí na webové stránce uživatele. Nejjednodušší způsob, jak zadat řetězec v kódu PHP, je uzavřít sekvenci znaků do uvozovek, jednoduchý ("") nebo dvojitý ("), například takto:

$myString = "Jednoduchý řetězec"; $anotherString = "Další řetězec";

Rozdíl mezi jednoduchými a dvojitými uvozovkami je způsoben tím, jak rozsáhle prostředí PHP interpretuje znaky v uvozovkách před vytvořením skutečného řetězce. Pokud je řetězec uzavřen do jednoduchých uvozovek, neprovádí se téměř žádná interpretace, a pokud je řetězec uzavřen do dvojitých uvozovek, pak prostředí PHP provede náhradu hodnot všech proměnných, které jsou v řetězci specifikovány, a také nahrazuje některé sekvence speciálních znaků, které začínají zpětným lomítkem ().

Například po zpracování následujícího kódu, který je součástí webové stránky:

$počet = 13; $string1 = "Řetězec \"Ahoj světe!\" obsahuje $count znaků.
"; $string2 = "Řetězec \"Ahoj světe!\" obsahuje $count znaků.
"; echo $string1; echo $string2;

můžete očekávat, že v okně prohlížeče získáte následující výstup:

Náhrada hodnoty pomocí složených závorek

Ve většině situací můžete proměnnou jednoduše uzavřít do řetězce s dvojitými uvozovkami a hodnota proměnné bude do řetězce nahrazena, když interpret řetězec zpracuje. Ale ve dvou situacích popsaných níže se může ukázat, že interpret řetězců není schopen učinit informované rozhodnutí a potřebuje další pokyny od vývojáře.

První situace je, že interpret nedokáže určit, kde končí název proměnné, a druhá situace nastává, když je potřeba do řetězce dosadit nikoli hodnotu jednoduché proměnné, ale hodnotu výrazu. V těchto případech může vývojář objasnit název nebo výraz, který má být zpracován, ve složených závorkách (()).

Například PHP interpret nemá problém se zpracováním následujícího kódu:

$sport = "volejbal"; $play = "Miluji hraní $sport.";

V takových případech tlumočník narazí na znak $, poté začne podřetězec znaků odhalit název proměnné, a to tak dlouho, dokud nenarazí na mezeru nebo tečku, která následuje za názvem proměnné $sport. Mezery a tečky nemohou být součástí názvu proměnné, takže je jasné, že se daná proměnná jmenuje $sport; interpret PHP pak úspěšně najde hodnotu pro danou proměnnou („volejbal“) a dosadí ji.

Někdy ale není možné označit konec názvu proměnné mezerou nebo tečkou. Zvažte následující příklad:

$sport1 = "vůle"; $sport2 = "noha"; $sport3 = "košík"; // Nesprávné konstrukce $play1 = "Miluji hraní $sport1ball."; $play2 = "Miluji hraní $sport2ball."; $play3 = "Miluji hraní $sport3ball.";

V tomto případě nebude dosaženo požadovaného efektu, protože PHP interpret bude považovat řetězec $sport1 za součást názvu proměnné $sport1ball, které zřejmě nebyla přiřazena žádná hodnota. Místo toho musíte použít následující zápis:

// Platná konstrukce $play1 = "Rád hraji ($sport1)ball."; $play2 = "Miluji hraní ($sport2)ball."; $play3 = "Miluji hraní ($sport3)ball.";

Tento zápis říká interpretu PHP, že před nahrazením hodnoty je třeba vyhodnotit pouze hodnotu výrazu s názvem proměnné uzavřeným ve složených závorkách.

Z podobných důvodů má PHP interpret, pokud nejsou použity složené závorky, potíže s nahrazením hodnot komplexních výrazů jmény proměnných, jako je přístup k prvkům vícerozměrných polí a objektových proměnných. Obecným pravidlem je, že pokud za úvodní složenou závorkou (() bezprostředně následuje znak $, pak interpret PHP vyhodnotí hodnotu výrazu s názvem proměnné až po koncovou složenou závorku ()) a výslednou hodnotu dosadí do provázku. (Pokud chcete, aby se v řetězci objevila doslovná hodnota ($), lze to provést tak, že před každým z těchto znaků dáte zpětné lomítko \).

Znaky a znakové indexy v řetězcích

Na rozdíl od některých jiných programovacích jazyků nemá PHP samostatný typ znaku, který by nebyl stejný jako typ řetězce. Obecně řečeno, funkce, které vyžadují skutečné parametry znaků v jiných jazycích, jsou navrženy tak, aby v PHP braly řetězce délky 1.

Výběr jednotlivých znaků z řetězce lze provést zadáním nulového pořadového čísla znaků, které musí být uvedeno ve složených závorkách bezprostředně za názvem proměnné řetězce. Takové znaky jsou ve skutečnosti jednoznakové řetězce. Například spuštění následujícího kódu:

$myString = "Dvojnásobek"; for ($index = 0; $index< strlen($myString); $index++) { $char = $myString{$index}; print("$char$char"); }

výsledkem je následující výstup v okně prohlížeče:

Je zřejmé, že každý znak řetězce je vytištěn dvakrát při každém průchodu smyčkou. Funkce strlen() vrací délku řetězce.

Řetězcové operace

PHP poskytuje dvě operace s řetězci: operátor tečky (.) nebo operátor zřetězení a operátor tečky a rovnítka (.=) nebo operátor zřetězení a přiřazení. Zvažte následující příklad:

$string1 = "Toto je část"; $string2 = "řetězce"; // echo zřetězení řetězců $string1." simple ".$string2."
"; // "Toto je část jednoduchého řetězce" // Zřetězit a přiřadit $string1 .= " simple "; // Ekvivalent $string1 = $string1." simple "; $string1 .= $string2; echo $string1; // "Toto je část jednoduchého řetězce"

Je třeba poznamenat, že ve výše uvedeném příkladu není prvnímu příkazu echo předáno několik skutečných parametrů řetězce; je předán pouze jeden skutečný parametr řetězce, který je výsledkem zřetězení čtyř řetězců. První a třetí řádek jsou nastaveny pomocí proměnných a druhý a čtvrtý řádek jsou doslovný řetězec uzavřený do dvojitých uvozovek.

Struktura syntaxe vnořeného dokumentu (Heredoc)

Kromě syntaktických struktur řetězců v jednoduchých a dvojitých uvozovkách poskytuje PHP další způsob, jak určit řetězec, tzv. syntaktická struktura vnořeného dokumentu (Heredoc). Jak se ukázalo, taková syntaktická struktura je velmi pohodlným prostředkem pro specifikaci velkých fragmentů textu nahrazovaných pomocí proměnných, protože eliminuje potřebu uživatele označovat vnitřní uvozovky pomocí speciálních znaků. Tato metoda je užitečná zejména při vytváření stránek, které obsahují formuláře HTML.

Znak operátoru použitý v syntaktické struktuře vnořeného dokumentu je (<<<). За этим знаком должна непосредственно следовать метка (не заключенная в кавычки), которая обозначает начало многострочного текста. Интерпретатор PHP продолжает включать в состав значения переменной следующие строки до тех пор, пока снова не появится эта же метка в начале строки. За заключительной меткой может следовать необязательная точка с запятой, а какие-либо другие символы после метки не допускаются.

Zvažte následující příklad:

$string =<<

EOT; echo $string;

Všimněte si, že poslední slovo EOT zobrazené výše by nemělo být vůbec odsazeno, jinak bude považováno za součást dodatečného zahrnutého textu. Není nutné používat slovo "EOT" jako štítek, štítek může mít libovolný název podle obvyklých konvencí pojmenovávání proměnných PHP.

Proměnná substituce se provádí přesně stejným způsobem jako při použití řetězců uzavřených v uvozovkách. Pohodlnou vlastností vnořeného dokumentu je, že do takto označeného textu lze vkládat uvozovky bez použití jakýchkoliv řídicích znaků a nedochází tak k předčasnému dokončení tvorby řádků. Výše uvedený příklad zobrazuje jednoduchý HTML formulář:

Řetězcové funkce

Jazyk PHP poskytuje širokou škálu funkcí pro zpracování a konverzi řetězců. Pokud budete někdy potřebovat vytvořit svou vlastní funkci, která čte a zpracovává řetězce znak po znaku za účelem vytvoření nového řetězce, nejprve zvažte, zda někdo jiný nečelil podobnému úkolu. A pokud intuice naznačuje, že taková možnost existuje, pak možná existuje vestavěná funkce, která problém řeší. Další informace o funkcích řetězců najdete na https://php.net/manual/en/ref.strings.php.

Tato část představuje základní funkce pro kontrolu, porovnávání, úpravy a tisk řetězců. Aby bylo možné skutečně ovládat zařízení PHP pro manipulaci s řetězci, zdá se, že by člověk měl být alespoň zběžně obeznámen se vším, co je uvedeno v této části. Popis funkcí určených pro práci s regulárními výrazy naleznete v následujícím článku.

Ověření řetězce

Jaké jsou nejčastější otázky týkající se řetězců, na které je třeba odpovědět? První na seznamu otázek je otázka, jak dlouhý je řetězec; k jejímu zodpovězení se používá funkce strlen(), jejíž název je zkratkou pro délku řetězce - délku řetězce. Příklad použití takové funkce je uveden níže:

$enStr = "Ahoj světe!"; $rusStr = "Jednoduchý řetězec"; echo $enStr." - znaky ".strlen($enStr).".
"; echo $rusStr." - ".strlen($rusStr)." znaky";

Spuštění tohoto kódu vytváří následující nejednoznačný výstup:

Jak vidíte, pro řetězec "Ahoj světe!" výsledek je správný, ale pro řetězec "Jednoduchý řetězec" je výsledek 27 znaků nesprávný. o co tady jde? Faktem je, že funkce strlen() počítá bajty, nikoli znaky. V prvním případě jsou všechny znaky v řetězci v angličtině, tzn. jsou reprezentovány kódováním ASCII a kódovány jako 1 byte. V druhém případě řetězec obsahuje ruské znaky, které jsou zakódovány ve 2 bajtech (UTF-8). Aby se předešlo problémům později při práci s funkcemi řetězců, mělo by PHP používat funkce pro vícebajtová kódování, která začínají prefixem mb_. To znamená, že v předchozím příkladu musíte nahradit funkci strlen() funkcí mb_strlen() a explicitně zadat kódování:

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

Hledání znaků a podřetězců

Další otázkou týkající se řetězců je, co obsahují. Například funkce strpos() vám umožňuje najít číslo pozice konkrétního znaku v řetězci, pokud existuje:

$enStr = "Ahoj světe!"; echo "Symbol "l": ".strpos($enStr, "l"); // 2

Situace zahrnující použití funkce strpos() jsou případy, ve kterých může být problémem typová necitlivost PHP. Pokud není nalezena shoda, funkce vrátí hodnotu false, a pokud se hledaný znak shoduje s úplně prvním znakem v řetězci, funkce vrátí 0 (protože pozice znaků v řetězci začínají na 0, nikoli na 1). Obě tyto hodnoty odpovídají false při použití k testování booleovské podmínky. Jedním ze způsobů, jak tyto hodnoty odlišit, je použít operátor porovnání identit (operátor ===, zavedený od PHP4), který vrací true pouze v případě, že jeho operandy jsou stejné a jsou stejného typu. Operátor porovnání identit lze použít k testování, zda je vrácená hodnota 0 (nebo nepravda), aniž by hrozilo, že dojde k záměně vrácené hodnoty s jinými hodnotami, které by mohly být po přetypování stejné.

Funkci strpos() lze také použít k vyhledání podřetězce místo jednoho znaku. K tomu stačí zadat víceznakový řetězec, nikoli jednoznakový řetězec, jako požadovaný. Kromě toho můžete ve volání této funkce zadat další celočíselný parametr, který určuje pozici začátku vyhledávání.

Je také možné hledat v opačném směru, od konce řetězce k začátku. K tomu slouží funkce strrpos(). (Všimněte si, že tato funkce má ve svém názvu navíc r, což je zkratka pro obrácený výraz.) Tato funkce bere jako parametry řetězec, který se má hledat, a jednoznakový řetězec, který se má hledat, a poté vrací výskyty poslední pozice druhého parametru. v prvním parametru. (Na rozdíl od funkce strpos() se ve funkci strrpos() musí hledaný řetězec skládat pouze z jednoho znaku.) Po aplikaci této funkce se stejnými parametry jako v předchozím příkladu bude nalezena další pozice:

$enStr = "Ahoj světe!"; echo "Symbol "l": ".strrpos($enStr, "l"); // 9 protože vyhledávání je od konce řetězce

Srovnání

Odpovídá tento řádek tomuto řádku? Zdá se, že kód musí často odpovídat i na tuto otázku, zejména pokud jde o zpracování vstupu od koncového uživatele.

Nejjednodušší metodou, jak najít odpověď na otázku, zda jsou řetězce stejné, je použít jednoduchý operátor porovnání rovnosti (==), který kontroluje rovnost nejen řetězců, ale i čísel. Při použití operátoru == jsou dva řetězce považovány za stejné, pokud obsahují přesně stejné sekvence znaků. Tím se nekontroluje přísnější definice identických řetězců, jako je podmínka, že tyto řetězce jsou uloženy v paměti na stejné adrese, ale rozlišuje se malá a velká písmena (jinými slovy, zda jsou porovnávaná písmena velká nebo malá) .

Výsledky porovnání dvou řetězců pomocí operátoru == (nebo odpovídajících operátorů< и >) lze věřit pouze v případě, že oba operandy jsou řetězce a je známo, že nedošlo k žádné konverzi typu. A výsledkům kontroly pomocí funkce strcmp(), která je popsána níže, lze vždy věřit.

Nejdůležitější funkcí porovnávání řetězců, která dělá většinu práce, je strcmp(). Tato funkce bere dva řetězce jako parametry a porovnává bajt po bajtu, dokud nenajde rozdíl. Funkce pak vrátí záporné číslo, pokud je první řetězec menší než druhý, a kladné číslo, pokud je druhý řetězec menší než první. Pokud jsou řetězce identické, funkce strcmp() vrátí nulu.

Funkce strcasecmp() funguje stejným způsobem, až na to, že porovnání rovnosti nerozlišuje malá a velká písmena. Například volání strcasecmp("hey!", "HEY!") by mělo vrátit nulu.

Vyhledávání

Právě popsané porovnávací funkce vám dají vědět, zda se jeden řetězec rovná jinému řetězci. A k určení, zda je jeden řetězec obsažen v jiném, použijte funkci strpos() popsanou výše nebo funkci strstr() a podobné funkce.

Funkce strstr() bere jako parametry řetězec, který se má prohledat, a řetězec, který se má prohledávat (v tomto pořadí). Pokud je tato funkce úspěšná, vrátí část řetězce, která začíná prvním výskytem hledaného řetězce (a zahrnuje hledaný řetězec). Pokud žádný takový řetězec není nalezen, funkce vrátí hodnotu false. Následující fragment kódu obsahuje příklady použití této funkce:

$str = "Ahoj světe!"; $findStr = "svět"; echo "Podřetězec" $findStr" v původním řetězci: ".strstr($str, $findStr);

Stejně jako funkce strcmp() má funkce strstr() verzi stristr() bez rozlišení velkých a malých písmen (i v tomto názvu je zkratka pro insensitive). Funkce stristr() je ve všech ohledech identická s funkcí strstr() kromě toho, že porovnání považuje malá písmena za jejich protějšky s velkými písmeny.

Vzorkování podřetězců

Mnoho funkcí PHP řetězců provádí operace vyjmutí a vložení s řetězci. Řez je výběr části struny a vkládání je selektivní modifikace struny. Mějte na paměti, že ani funkce insert (nejčastěji) nemodifikují řetězec zadaný jako vstupní parametr. Tyto funkce obvykle vracejí upravenou kopii a ponechávají původní parametr beze změny.

Nejjednodušší způsob, jak navzorkovat část řetězce, je použít funkci substr(), která vrací nový řetězec obsahující část podsekvence znaků ze starého řetězce. Funkce substr() bere jako parametry řetězec (ze kterého se má podřetězec vzorkovat), celé číslo (pozice, na které začíná požadovaný podřetězec) a volitelný třetí parametr celého čísla, který určuje délku požadovaného podřetězce. Pokud není zadán třetí parametr, předpokládá se, že podřetězec pokračuje až do konce řetězce. (Je třeba si uvědomit, že při použití této funkce začíná číslování pozic v řádku od nuly, a nikoli od jedné, jako u všech parametrů PHP funkcí, které označují číselné pozice v řetězcích.) Například:

$str = "Ahoj světe!"; echo mb_substr($str, 7, 3, "UTF8"); // "svět"

Parametr počáteční pozice i parametr délky mohou být záporné, ale v obou těchto případech má záporná hodnota jiný význam. Je-li počáteční pozice záporná, je pozice počátečního znaku podřetězce určena počítáním pozpátku od konce řetězce, spíše než počítáním vpřed od začátku řetězce. (Počáteční pozice -1 označuje, že počítání začíná od posledního znaku, hodnota -2 označuje předposlední znak atd.)

Na základě toho by se dalo předpokládat, že záporná hodnota délky také znamená, že podřetězec by měl být určen počítáním zpět od počátečního znaku, spíše než počítáním dopředu, ale není tomu tak. Tvrzení, že znak na počáteční pozici je první znak ve vráceném řetězci (a ne poslední), je vždy pravdivé. Místo toho záporný parametr délky znamená, že koncový znak je určen počítáním zpět od konce, spíše než počítáním dopředu od počáteční pozice.

Níže uvádíme několik příkladů s pozitivními a negativními parametry:

$str = "Ahoj světe!"; echo mb_substr($str, 7, 3, "UTF8")."
"; // "svět" echo mb_substr($str, -4, 3, "UTF8")."
"; // "svět" echo mb_substr($str, 0, -5, "UTF8")."
"; // "Ahoj"

Odstranění mezer a tabulátorů z řetězců

Technicky vzato jsou funkce chop(), ltrim() a trim() funkcemi pro práci s podřetězci (které jsou velmi podobné jiným funkcím), ale ve skutečnosti jsou tyto funkce navrženy k odstranění nežádoucích znaků z řetězců. Funkce chop(), ltrim() a trim() odstraňují koncové, úvodní, úvodní a koncové prázdné znaky z řetězce zadaného jako jediný parametr řetězce.

Kromě mezer tyto funkce odstraňují další prázdné znaky, například znaky označené sekvencemi escape \n, \r, \t a \0 (znaky konce řádku, tabulátory a znaky null používané k označení konce řádku v programech C).

V PHP je běžné používat funkci k odstranění mezer na konci řetězce, nazývanou chop(), ale lze volat i identickou funkci, popisněji pojmenovanou rtrim(). Na závěr je třeba poznamenat, že funkce chop() i přes to, že její název, který znamená „odříznout“, zní velmi hrozivě, nepoškozuje původní parametr $original, který si zachovává předchozí hodnotu.

Výměna struny

Všechny funkce řetězce diskutované výše poskytovaly výběr části vstupního parametru a nikoli vytvoření zcela nového řetězce. Tato část pojednává o funkcích str_replace() a substr_replace() pro tento účel.

Funkce str_replace() umožňuje nahradit všechny výskyty daného konkrétního podřetězce jiným řetězcem. Tato funkce má tři parametry: řetězec, který má být prohledán, podřetězec, který má být nahrazen po jeho nalezení, a řetězec, který má být použit pro nahrazení. Zvažte následující příklad:

$str = "Ahoj světe!"; echo str_replace("svět", "planeta", $str); // "Ahoj planete!"

Nahrazení se provádí u všech výskytů podřetězce nalezeného v hledaném řetězci. Pokud by byl výše uvedený příklad použit k nahrazení názvu města v zastaralé encyklopedii, pak by po převedení celého textu encyklopedie do jednoho PHP řádku bylo možné takovou náhradu v celém textu provést v jednom průchodu.

Jak je ukázáno výše, funkce str_replace() vybírá část zdrojového řetězce, která má být nahrazena, hledáním výskytů požadovaného podřetězce ve zdrojovém řetězci; naproti tomu substr_replace() vybere část, která má být nahrazena, její absolutní pozicí. Tato funkce zabírá až čtyři parametry: řetězec, který má být nahrazen, řetězec, který se má použít jako nahrazení, počáteční pozici nahrazení a (jako volitelný parametr) délku části řetězce, která má být nahrazena. Zvažte následující příklad:

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

Část CDE řetězce byla nahrazena jedním znakem. Všimněte si, že v tomto případě bylo povoleno nahradit podřetězec řetězcem jiné délky. Pokud je parametr délka vynechán, pak se předpokládá, že bude nahrazena celá část řetězce za počáteční pozicí.

Funkce substr_replace() také přijímá záporné parametry jako počáteční pozici a délku, se kterými se zachází přesně jako ve funkci substr() výše. Je důležité si uvědomit, že v důsledku operací prováděných pomocí funkcí str_replace a substr_replace, původní řetězec zůstane nezměněn.

Konečně existuje řada méně používaných funkcí, které tvoří nové řetězce ze starých. Funkce strrev() jednoduše vrátí nový řetězec s obrácenými znaky ve vstupním řetězci. Funkce str_repeat() vezme jeden řetězec a jeden celočíselný parametr a vrátí řetězec obsahující zadaný počet kopií parametru řetězce:

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

Funkce převodu případu

Tyto funkce umožňují převádět malá písmena na velká a naopak. Funkce strtolower() vrací řetězec se všemi písmeny převedenými na malá písmena. Nezáleží na tom, zda původní řetězec obsahoval pouze velká písmena nebo velká a malá písmena. Například:

$str = "Ahoj světe!"; echo mb_strtolower($str, "UTF8"); // "Ahoj světe!"

Pokud jste již zažili potřebu provádět velké množství ověřování formulářů, možná jste si všimli, že funkce strtolower() je mimořádně praktický nástroj pro práci s e-mailovými adresami přijatými od uživatelů, kteří stále nevědí, že e-mailové adresy jsou velká a malá písmena. -necitlivý. Neméně užitečné jsou i další funkce související s touto kategorií.

Funkce strtoupper() vrací řetězec se všemi písmeny převedenými na velká. Příkladem je následující fragment kódu:

$str = "Ahoj světe!"; echo mb_strtoupper($str, "UTF8"); // "AHOJ SVĚTE!"

Funkce ucfirst() velké pouze první písmeno řetězce, funkce ucwords() velké první písmeno každého slova v řetězci. Ani funkce ucwords() ani ucfirst() nemají podobnou funkci pro vícebajtové kódování, takže nejsou kompatibilní s řetězci v azbuce.

Funkce pro vkládání řídicích znaků

Jednou z výhod jazyka PHP je, že jej lze použít k výměně dat s téměř jakýmkoli systémem. Prostředky tohoto druhu jsou obvykle považovány za druh "softwarového lepidla". V této roli se jazyk PHP používá k interakci s databázovými servery, servery LDAP, k výměně dat prostřednictvím soketů a samotného HTTP připojení. Tato interakce se často provádí tak, že se nejprve vytvoří řetězec zprávy (jako databázový dotaz) a poté se tato zpráva předá přijímajícímu programu. Ale programy často dávají některým znakům zvláštní význam, a proto je třeba je převést na řídicí znaky. To znamená, že přijímající program je instruován, aby s takovými znaky zacházel jako s doslovnou částí řetězce, spíše než aby s nimi uplatňoval speciální zacházení.

Mnoho uživatelů, aby se vypořádalo s tímto problémem, umožňuje použití takzvaného „režimu magických citací“, který zajišťuje převedení uvozovek na řídicí znaky před vložením řetězců do databází. Ale pokud takový způsob zpracování není proveditelný nebo žádoucí, pak je třeba použít staré dobré prostředky vložení znaků zpětného lomítka a následné odstranění těchto znaků.

Funkce addlashes() převádí jednoduché a dvojité uvozovky, zpětná lomítka a znaky null na sekvence escape pomocí zpětných lomítek, protože tyto znaky je obvykle třeba převést na sekvence escape při přípravě dotazů na databáze:

$escapedstring = addlashes("Řetězec s "uvozovkami"."); $query = "INSERT INTO testovací (uvozovky) hodnoty ​​("$escapedstring")"; $vysledek = mysqli_query($link, $dotaz) or die(mysql_error());

Spuštění tohoto kódu zabrání nesprávné interpretaci příkazu SQL, jako by řetězec končil těsně před písmenem "k". A po načtení těchto dat musíte použít funkci stripslashes() k odstranění zpětných lomítek.

Funkce quotemeta() převádí širší sadu znaků na sekvence escape. Všechny tyto znaky mají na příkazovém řádku Unixu obvykle speciální význam: " . ", " " ", " + ", " * ", " ? ", " [ ", " ] ", " ^ ", " (", " $ " a ")". Například spuštění následujícího kódu:

$str = "Tyto znaky ($, *, ^) je třeba převést."; echo quotemeta($str);

vypíše tento řádek:

Funkce výstupu na externí zařízení a na linku

Hlavní konstrukce používané pro výstup jsou tisk a echo, které byly podrobně diskutovány dříve. Standardním způsobem výstupu hodnot proměnných na externí zařízení je zahrnout názvy těchto proměnných do řetězce s dvojitými uvozovkami (který zpracuje interpret, aby nahradil hodnoty proměnných), a poté předat tento řetězec do konstrukce tisku nebo echo.

Pokud potřebujete ještě přesněji formátovaný výstup, můžete použít funkce printf() a sprintf() PHP. Tyto dvě funkce mají stejné parametry: speciální formátovací řetězec následovaný libovolným počtem dalších parametrů, které jsou nahrazeny na správných místech ve formátovacím řetězci, aby vytvořily výsledek. Jediný rozdíl mezi printf() a sprintf() je ten, že printf() posílá výsledný řetězec přímo na externí zařízení použité pro výstup, zatímco sprintf() vrací výsledný řetězec jako výsledek svého spuštění.

Několik slov pro zkušené programátory v jazyce C. Tato verze sprintf() se mírně liší od verze C v tom, že sprintf() nemusí poskytovat přidělený řetězec pro zápis, protože interpret PHP alokuje paměť pro výsledný řetězec jménem uživatel.

Hlavním problémem spojeným s používáním těchto funkcí je správná definice formátovacího řetězce. Každý znak ve formátovacím řetězci se objeví přímo ve výsledné hodnotě, kromě znaků % a znaků, které za těmito znaky bezprostředně následují. Symbol % označuje začátek specifikace převodu, která určuje, jak odeslat na externí zařízení jeden z parametrů, který následuje za formátovacím řetězcem.

Za znakem % je pět prvků, které tvoří specifikaci převodu, které jsou popsány níže, z nichž některé jsou volitelné: výplň, zarovnání, minimální šířka, přesnost a typ:

  • Volitelné znaménko mínus (-) se používá k označení, zda je číslo záporné.
  • Jediným (volitelným) znakem výplně je buď 0, nebo mezera (). Tento symbol se používá k vyplnění jakéhokoli prostoru, který by jinak zůstal prázdný, ale na jehož výběru uživatel trval (nastavením parametru minimální šířky příliš vysoko). Pokud tento znak pro odsazení není zadán, použije se jako výchozí odsazení mezerami.
  • Volitelný znak zarovnání (-) určuje, zda má být výstupní hodnota zarovnána doleva nebo doprava. Pokud je tento znak zadán, bude hodnota zarovnána doleva, a pokud není přítomen, použije se zarovnání doprava.
  • Volitelná číselná hodnota minimální šířky, která určuje minimální počet pozic, které by měla výstupní hodnota zaujímat. (Pokud výstupní hodnoty vyžadují více pozic znaků, než je uvedeno, pak je výstupní hodnota mimo rozsah.)
  • Volitelný specifikátor přesnosti, formátovaný jako tečka (.) následovaná číslem. Specifikátor udává, s jakou přesností, měřenou počtem desetinných míst za čárkou, by mělo být na výstupu číslo s plovoucí desetinnou čárkou s dvojitou přesností. (Použití této specifikace nemá žádný vliv na výstup jiných dat než čísel s plovoucí desetinnou čárkou s dvojitou přesností.)
  • Jediný znak označující, jak má být typ hodnoty interpretován. Znak f označuje, že hodnota by měla být vytištěna jako číslo s plovoucí desetinnou čárkou s dvojitou přesností, znak s označuje, že hodnota by měla být vytištěna jako řetězec, a zbývající možné znaky (b, c, d, o, x, X ) označují, že hodnota by měla být interpretována jako celé číslo a výstup v různých formátech. Tyto formáty jsou b pro výstup v binárním formátu, c pro výstup znaku s odpovídající hodnotou ASCII kódu, o pro výstup v osmičkovém formátu, x pro výstup v hexadecimálním formátu (s malými písmeny číslic). ) a X pro zobrazení hexadecimální čísla, která používají velká písmena jako doslovné symboly pro číslice.

Následuje příklad výstupu stejného čísla s plovoucí desetinnou čárkou s dvojitou přesností několika různými způsoby:

%10f 
%-10f
%2.2f", $value, $value, $value, $value); ?>

Vytváří následující výsledky:

Konstrukce použitá v tomto příkladu

...
je HTML deskriptor, který prohlížeči říká, že blok uzavřený v tomto deskriptoru by měl být formátován doslovně, bez komprimace více mezer do jedné atd.

Funkce pro práci s HTML kódem

PHP poskytuje řadu funkcí pro manipulaci s řetězci obsahujícími data specifická pro web. Přehled těchto funkcí je uveden v tabulce níže:

Řetězcové funkce navržené pro práci s kódem HTML

Funkce Popis
htmlspecialchars() Vezme řetězec jako parametr a vrátí řetězec, ve kterém byly čtyři znaky, které mají v jazyce HTML zvláštní význam, nahrazeny speciálními řetězci. Každý z těchto znaků je nahrazen odpovídající HTML komponentou, která je při rozbalení textu stránky v prohlížeči opět nahrazena původním znakem. Znak & je nahrazen složkou znak & " (uvozovka) - znakem "< - < а символ > - >
htmlentities() Provádí úplnější zpracování než htmlspecialchars(), tj. nahradí komponentou HTML nejen speciální znaky, ale i všechny znaky, pro které je náhrada komponentou HTML zajištěna
get_html_translation_table() Vezme jednu ze dvou speciálních konstant (HTML_SPECIAL_CHARS nebo HTML_ENTITIES) a vrátí převodní tabulku používanou funkcemi htmlspecialchars() nebo htmlentities(). Vyhledávací tabulka je pole, jehož klíče jsou znakové řetězce a jehož odpovídající hodnoty jsou řetězce, které je nahrazují.
nl2br() Vezme řetězec jako parametr a vrátí stejný řetězec, ale s deskriptory
, vložené před všechny znaky konce řádku (\n, \r nebo \r\n). Potřeba použití této funkce vyvstává například v případě, že chcete zajistit stejné odstavování textu zobrazeného v prohlížeči jako ve zdrojovém textu
strip_tags() Bere řetězec jako parametr a snaží se vytvořit řetězec zbavený všech HTML deskriptorů a všech PHP deskriptorů

Hašování dat pomocí algoritmu MD5

Algoritmus MD5 je algoritmus pro zpracování řetězců, který se používá ke generování tzv. digestu neboli digitálního podpisu pro jakýkoli řetězec předaný jako parametr. Algoritmus generuje řetězec konstantní délky na základě vstupního řetězce, který se skládá z 32 hexadecimálních číslic (0-9, a-f). Výsledky generované algoritmem MD5 mají velmi užitečné vlastnosti, jak je popsáno níže:

  • Algoritmus MD5 vždy zajišťuje, že výstupní řetězec je stejný, když je zadán stejný vstupní řetězec, takže k ukládání hesel nelze použít šifrování MD5.
  • Výsledky aplikace algoritmu MD5 mají pevnou délku a jsou velmi rovnoměrně rozloženy v celém rozsahu možných hodnot.
  • Lze vygenerovat vstupní řetězec, který odpovídá danému výstupnímu řetězci algoritmu MD5, nebo lze vytvořit dva vstupní řetězce, jejichž zpracování by vedlo ke stejnému výstupnímu řetězci, ale pouze za určitých podmínek.

Implementace algoritmu MD5 v PHP je dostupná jako funkce md5(), která bere řetězec jako vstup a vytváří výsledky jako 32znakový výtah. Například spuštění následujícího kódu:

$str = "Ahoj světe!"; echo "Hash kód pro řetězec "$str": ".md5($str)."
"; $str = "Ahoj světe!"; echo "Hash kód pro řetězec "$str": ".md5($str)."
"; $str = "Ahoj světe"; echo "Hash kód pro řetězec "$str": ".md5($str)."
";

výsledkem jsou následující výsledky v okně prohlížeče:

Samozřejmě, že v tomto případě jsou všechny vstupní řetězce navzájem velmi podobné, ale výstupní řetězce nemají žádnou viditelnou podobnost. Také rozsah možných výstupních hodnot je extrémně velký (1632), takže šance na zpracování dvou různých řetězců (které by vytvořily stejnou hodnotu MD5) jsou extrémně nepravděpodobné.

Vzhledem k výše uvedeným vlastnostem algoritmu MD5 lze hodnoty získané s jeho pomocí použít k řešení široké škály problémů, včetně těch popsaných níže:
Výpočet kontrolního součtu zprávy nebo souboru
Chcete-li zkontrolovat, zda byla zpráva během přenosu poškozena, můžete spolu se zprávou odeslat výtah MD5 a po přijetí zprávy znovu vytvořit výtah MD5. Pokud se dvě verze výtahu neshodují, došlo během přenosu k poškození.
Kontrola nad tím, zda obsah souboru zůstane nezměněn
Tato úloha je podobná úloze výpočtu kontrolního součtu. Algoritmus MD5 se často používá k provedení této operace ve vyhledávačích, pokud je potřeba pravidelně kontrolovat, zda se webová stránka nezměnila, a v případě potřeby reindexovat. Faktem je, že pro další ověření je mnohem snazší uspořádat úložiště MD5 digest než celý zdrojový soubor.
Rozdělení více řetězců nebo souborů do podmnožin
Chcete-li vyřešit problém rozdělení sady řetězců do N náhodně vybraných podmnožin, můžete vypočítat MD5 výtah každého řetězce, vzít prvních několik hexadecimálních znaků, převést je na číslo, získat modulo modulo tohoto čísla a použít to. zbytek jako číslo podmnožiny, do které má být tento řádek zapsán.

Kromě funkce md5() poskytuje PHP funkci md5_file(), která bere jako parametr název souboru a vrací hashovanou hodnotu MD5 odpovídající obsahu souboru.

Funkce určené k vyhodnocení podobnosti řetězců

V praxi je často nutné určit, jak podobné jsou dva řetězce. Je zřejmé, že výsledky odhadu podobnosti řetězců závisí na tom, co je míněno pojmem podobnosti řetězců.

Pokud je podobnost v pravopisu považována za kritérium pro hodnocení podobnosti, lze použít Levenshteinova metrika. Funkce levenshtein() bere jako parametry dva řetězce a vrací minimální počet operací přidání, odstranění a nahrazení znaků potřebných k převodu jednoho řetězce na jiný. Zvažte příklad:

echo levenshtein("Čas", "Čas"); // 1 echo levenshtein("chlapec", "chefboyardee"); // 9 echo levenshtein("nikdy", "chytry"); // 2

Pokud je fonetická podobnost považována za kritérium podobnosti, lze k vyhodnocení podobnosti použít funkce soundex() a metaphone(). Obě tyto funkce vezmou příslušný řetězec jako vstup a vrátí řetězec klíčů označující kategorii výslovnosti daného slova (které je považováno za anglické slovo). Pokud dvě slova použitá jako obsah vstupního řetězce odpovídají přesně stejné výstupní hodnotě, budou pravděpodobně vyslovována stejně.

Funkce analýzy a tokenizace

Někdy je pro program nutné rozdělit řetězce na komponenty, vedené vlastní definicí toho, co by mělo být považováno za komponentu. Proces rozdělení dlouhého řetězce na části se nazývá tokenizace. Takový proces je zejména součástí obecného postupu pro interpretaci nebo kompilaci jakéhokoli počítačového programu, včetně programu napsaného v PHP. Jazyk PHP poskytuje pro tento účel speciální funkci - strtok ().

Funkce strtok() má dva parametry: řetězec k tokenizaci a řetězec obsahující všechny oddělovače (znaky, se kterými se zachází jako s hranicemi mezi tokeny). Při prvním volání se použijí oba parametry a funkce vrátí hodnotu řetězce představující první token. Pro načtení následujících tokenů se provede stejné volání, ale parametr zdrojového řetězce je vynechán. Funkce si pamatuje adresu řetězce zadanou v prvním parametru a používá ji jako aktuální řetězec. Tato funkce si navíc pamatuje, kde bylo zpracování při předchozím volání ukončeno. Zvažte následující příklad:

$token = strtok("webové skriptování na straně serveru vestavěné do HTML s otevřeným zdrojovým kódem", " "); while($token) ( echo $token."
"; $token = strtok(" "); )

což má za následek následující výstup v okně prohlížeče:

Původní řetězec je rozdělen v místě, kde se nachází každý prostor.

Funkce strtok() vytváří tokeny jeden po druhém. Můžete také použít funkci explode(), která provádí zhruba totéž, kromě toho, že ukládá všechny tokeny najednou do jednoho pole. Jakmile jsou tokeny prezentovány jako pole, lze s nimi provádět libovolné operace, včetně řazení.

Funkce explode() má dva parametry: oddělovací řetězec a řetězec, který se má rozdělit na tokeny. Tato funkce vrací pole, jehož každý prvek je podřetězcem mezi instancemi oddělovače v řetězci, který má být rozdělen. Zvažte následující příklad:

$explodeResult = explode("AND", "jedna AND a dva AND a tri");

výsledkem je pole $explode_result obsahující tři prvky, z nichž každý je řetězec: "jeden", "a dva" a "a tři". V tomto konkrétním příkladu se v žádném z řetězců obsažených v poli nevyskytují žádná velká písmena, protože ve výsledku není přítomen oddělovač AND.

Oddělovací řetězec použitý ve funkci explode() je zcela odlišný od oddělovacího řetězce použitého ve funkci strtok(). Oddělovač je úplný řetězec, takže všechny znaky v tomto řetězci musí být nalezeny ve zdrojovém řetězci ve stejném pořadí jako v oddělovači, aby byl oddělovač považován za nalezený.

Na druhou stranu, řetězec s oddělovači ve funkci strtok() specifikuje mnoho jednotlivých znaků, z nichž každý je považován za oddělovač. To znamená, že funkce explode() je selektivnější, ale náchylnější k rozbití. Zejména pokud v dlouhém řetězci náhodou chybí byť jen jedna mezera nebo znak konce řádku, který je součástí oddělovače, může být celá operace této funkce přerušena.

Funkce explode() má inverzní funkci implode(), která přebírá dva parametry: spojovací řetězec (podobný oddělovacímu řetězci ve funkci explode()) a pole řetězců podobné tomu, které vrací funkce explode( ) funkce. Funkce implode() vrací řetězec vytvořený vložením spojovacího řetězce mezi všechny po sobě jdoucí prvky řetězce v poli.