• Regulární výrazy (vzory). Regulární výrazy Regulární výrazy php nebo

    Už dlouho jsem chtěl porozumět regulárním výrazům. I když „přijít na to“ je silné slovo. Abyste zvládli velké umění stát se mistrem regulárních výrazů, musíte s nimi neustále pracovat. Nestačí se naučit syntaxi, speciální znaky a modifikátory – musíte je umět používat. A schopnost používat přichází se zkušenostmi.

    V tomto příspěvku uvedu příklady použití regulárních výrazů, jejichž práci jsem sám rozuměl.

    Tabulka speciálních znaků

    Zvláštní charakter Popis
    \ Symbol útěku. Příklad: „/seo\/smo/“- odpovídá řádku, který obsahuje seo/smo.
    ^ Začátek datového symbolu. Příklad: '/^seo/'— odpovídá řádku, který začíná slovem seo.
    $ Konec datového symbolu. Příklad: „/blog$/“— odpovídá řádku, který končí slovem blog.
    . Jakýkoli znak jiný než odřádkování. Příklad: '/seo.ult/'- odpovídá řetězci seopult, seo9ult, seo@ult atd.
    Uvnitř těchto závorek jsou uvedeny znaky, z nichž kterýkoli se může objevit na daném místě, ale pouze jeden. Příklad: '/seoult/'— porovnány budou pouze řádky obsahující seopult, seokult nebo seomult.
    | Nebo. Příklad níže.
    () Submaska.
    ? Jeden nebo žádný výskyt předchozího znaku nebo dílčího vzoru.
    * Libovolný počet výskytů předchozího znaku nebo dílčího vzoru. Včetně nuly.
    + Jeden nebo více výskytů.
    Příklad: ‘/se+(op|om)?.*t/’- písmeno s, dále jedno nebo více písmen e, za nimiž se kombinace op nebo om může objevit jednou, možná ani jednou, dále libovolný počet libovolných symbolů a písmeno t.
    (a,b) Počet výskytů předchozího znaku nebo dílčího vzoru od a do b. Příklad: (0,) - totéž jako *, (0,1) - totéž jako ?, (3,5) - 3, 4 nebo 5 opakování.

    Jednoduché příklady PHP skriptů využívajících regulární výrazy:

    1) Předchozí a následující výrazy.

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 // najde slovo, ve kterém ing následuje po Boxu. Pokud je slovo nalezeno, funkce vrátí true, pokud ne, false.$pattern1 = "/Box(?=ing)/" ; preg_match($pattern1, "Box Day"); // false preg_match ($pattern1, "Boxing Day" ) ; // skutečný // najít slovo, které nemá ing za rámečkem. Pokud je slovo nalezeno, funkce vrátí true, pokud ne, false.$pattern2 = "/box(?!ing)/" ; preg_match($pattern2, "Box pro iPhone a iPad"); // true preg_match ($pattern2, "Co je boxerský den?") ; // false preg_match ($pattern2, "css-moz-box-shadow" ) ; // skutečný // najde slovo, kde před ing není rámeček. Pokud je slovo nalezeno, funkce vrátí true, pokud ne, false.$pattern3 = "/(?

    [^<]+?~","seo blog",$text); echo $text; ?>

    3) Získejte a zobrazte hodnotu Alexa Rank daného webu.

    1 2 3 4 5 6 7 8 9 "#
    (.*?)
    #si", file_get_contents ( "http://www.alexa.com/siteinfo/($url)"), $a ); return trim (str_replace ("," , "" , strip_tags ($a [ 1 ] ) ) ) ; ) $alexa = alexa($url) ; echo $alexa ; ?>

    (.*?)

    #si", file_get_contents("http://www.alexa.com/siteinfo/($url)")), $a); return trim(str_replace(",",","strip_tags($a))); ) $alexa = alexa($url); echo $alexa;

    4) Získejte a zobrazte název stránky.

    1 2 3 4 5 (.*)<\/title>/s" , $str , $m ); echo $m [ 1 ] ; ?>

    (.*)<\/title>/s", $str, $m); echo $m; ?>

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 \n \r \t ]/", "", $obsah); // nahraďte znaky nového řádku a tabulátoru mezerami$obsah = preg_replace ("/(2,)/" , " " , $obsah ) ; // nahraďte více než 2 mezery jednou preg_match_all("/ ]*href=(?:"| \" )(.*)(?:"|\" )[^<>]*>(.*)<\/a>/iU", $obsah , $odkazy ); // sbírat odkazy if (sizeof ($links [ 1 ] ) > 0 ) // pokud jsou nalezeny odkazy( $out = pole () ; // pole externích odkazů foreach ($links [ 1 ] jako $v ) ( if (preg_match ("/http:\/\/(www\.)(0,1)" . $domain . "/i" , $v) ) // vyřazení interních odkazů( pokračovat ; ) if ( preg_match ( "/(http:|https:)?\/\/(www\.)(0,1)(.*)/i", $v)) // externí odkaz( $out = $v ; ) ) return $out ; ) return pole () ; ) $doména = "stránka" ; $obsah = file_get_contents ("http://site/" ) ; $getoutlinks = getoutlinks($obsah, $doména) ; pro ($i = 0; $i<= count ($getoutlinks ) ; $i ++ ) { echo $getoutlinks [ $i ] . "
    " ; } ?>

    ]*href=(?:"|\")(.*)(?:"|\")[^<>]*>(.*)<\/a>/iU", $content, $links); // shromažďovat odkazy if (sizeof($links) > 0) // pokud jsou odkazy nalezeny ( $out = array(); // pole externích odkazů foreach ($links as $v ) ( if (preg_match("/http:\/\/(www\.)(0,1)".$domain."/i", $v)) // vyřadit interní odkazy (pokračovat; ) if (preg_match ("/(http:|https:)?\/\/(www\.)(0,1)(..com/"); $getoutlinks = getoutlinks($content, $domain); for ( $i = 0;<= count($getoutlinks); $i++) { echo $getoutlinks[$i]."
    "; } ?>

    Kde:
    preg_replace— Provádí vyhledávání a nahrazování pomocí regulárního výrazu.
    preg_match— provede kontrolu proti regulárnímu výrazu.
    preg_match_all— najde všechny shody, zatímco preg_match najde pouze první.
    file_get_contents— získat obsah souboru jako jeden řádek.
    oříznout— odstraní mezery na začátku a konci řádku.
    str_replace— nahradí hledaný řetězec náhradním řetězcem.
    strip_tags— odstraní značky html a php z řetězce.
    velikost— získá počet prvků v proměnné.
    počet— počítá počet prvků pole nebo počet vlastností objektu.

    Regulární výrazy jsou velmi výkonným, ale zároveň těžko pochopitelným nástrojem pro zpracování řetězců. Popíšu hlavní body. Regulární výraz je vzor řetězce. Pomocí této šablony můžete vyhledávat výskyty, provádět nahrazování a kontrolovat shodu se šablonou.

    Pravidla pro vytváření vzoru

    Hranice šablony musí být označeny určitými symboly, často pomocí " / ", ale raději používám" # " protože množství dopředných/zpětných lomítek může oslnit vaše oči a hashovací značky se obvykle nikde jinde nepoužívají. Takže: " #HereBodyRegularExpression#"

    Závorky se používají uvnitř regulárního výrazu – jedná se o podvýrazy, se kterými lze manipulovat, například:

    #^/catalog/(+)/(+)\.html.*#

    Tento výraz je navržen tak, aby získal parametry v řetězci URL. Na začátku řádku je speciální znak " ^ " - to znamená začátek řádku. Následuje " /katalog/" - zde nejsou žádné speciální znaky, jedná se pouze o text, který by měl být obsažen v řádku. Poté jsme narazili na závorky, tj. dostali jsme se na první podvýraz. Hranaté závorky označují mnoho znaků, které mohou být v tomto místě v řádku. Znak " - " znamená výčet. Znamení " \ " uniká speciálním znakům. V prvním podvýrazu tedy můžeme mít VELKÁ KAPITÁLKA a malá písmena latinské abecedy, čísla od 0 do 9, podtržítko, pomlčku a tečku. Pomlčka a tečka jsou speciální znaky, ale zde jsou uvozeny, takže zde jsou pouze symboly za hranatými závorkami je znak ". + " - to znamená, že předchozí znak (a pro nás je to sada znaků specifikovaných v hranatých závorkách) se může objevit jednou nebo vícekrát. Pak přijde " / "je jen symbol a podobný druhý podvýraz. Pak přijde" \.html"co ten text znamená" .html". A pak speciální znaky" .* "Tečka znamená jakýkoli znak a hvězdička znamená libovolné množství předchozího znaku. To znamená po " .html„Všechno může jít.

    Indikace množství, kvantifikátory

    Výše jsme již uvažovali o takových symbolech udávajících počet předchozích symbolů, jako je např + A * . Zde jsou všechny možnosti pro určení množství:

    Speciální znaky

    Pro některé skupiny znaků existují speciální zkratky:

    "Chamtivost"

    Podívejme se na koncept regulárního výrazu chamtivost. Existuje například řádek:

    #()#

    Čteme: podvýraz:

    Vše se zdá být v pořádku, podvýraz sedí:

    Ale také se hodí:

    To je to, co dostaneme, protože... Regulární výrazy jsou ve výchozím nastavení chamtivé. Chamtivost můžete odstranit pomocí modifikátoru " U", takhle:

    #() #U

    Modifikátory

    Za regulárním výrazem mohou následovat modifikátory: " #HereBodyRegularExpression#HereModifiers"Typy modifikátorů:

    i Povolí režim bez rozlišení velkých a malých písmen, tj. velká a malá písmena ve výrazu se neliší.
    m Označuje, že hledaný text by měl být považován za sestávající z více řádků. Ve výchozím nastavení modul regulárních výrazů zachází s textem jako s jedním řetězcem bez ohledu na to, co ve skutečnosti je. Podle toho metaznaky "^" a "$" označte začátek a konec celého textu. Pokud je tento modifikátor zadán, pak budou označovat začátek a konec každého řádku textu.
    s Výchozí metaznak je " . " nezahrnuje ve své definici znak nového řádku. Zadáním tohoto modifikátoru toto omezení odstraníte.
    U Odstraňuje chamtivost regulárních výrazů
    u Umožňuje práci s regulárními výrazy Cyrilice na UTF-8, jinak nefunguje správně.

    php Funkce pro práci s regulárními výrazy

    preg_replace

    Hledat a nahradit:

    Preg_replace (smíšený $vzor , smíšený $náhrada , smíšený $předmět [, int $limit = -1 [, int &$počet ]]);

    Každá hodnota může být řetězec nebo pole, v případě $předmět pole - je vráceno pole, jinak řetězec

    preg_split

    Rozdělí řetězec pomocí regulárního výrazu:

    Preg_split (řetězec $vzor , řetězec $předmět [, int $limit = -1 [, int $příznaky = 0 ]]);

    Vrátí pole skládající se z podřetězců daného řetězce předmět, který je rozdělen podél hranic odpovídajících vzoru vzor.

    Při práci s texty v jakémkoli moderním programovacím jazyce se vývojáři neustále potýkají s úkoly kontroly zadaných dat z hlediska souladu s požadovaným vzorem, vyhledávání a nahrazování testovacích fragmentů a dalších typických operací pro zpracování symbolických informací. Vývoj vlastních ověřovacích algoritmů vede ke ztrátě času, nekompatibilitě programového kódu a složitosti při jeho vývoji a modernizaci.

    Rychlý rozvoj internetu a vývojových jazyků WEB si vyžádal vytvoření univerzálních a kompaktních nástrojů pro zpracování textových informací s minimálním množstvím potřebného kódu. Jazyk PHP, oblíbený mezi začátečníky i profesionálními vývojáři, není výjimkou. Regulární výraz jako jazyk textové šablony umožňuje zjednodušit úlohy zpracování textu a zmenšit programový kód o desítky a stovky řádků. Bez toho nelze vyřešit mnoho problémů.

    Regulární výrazy v PHP

    Jazyk PHP obsahuje tři mechanismy pro práci s regulárními výrazy – „ereg“, „mb_ereg“ a „preg“. Nejrozšířenější je rozhraní „preg“, jehož funkce poskytují přístup ke knihovně regulárních výrazů PCRE, původně vyvinuté pro jazyk Perl, která je součástí PHP. Funkce Preg vyhledá v daném textovém řetězci shody podle konkrétního vzoru v jazyce regulárních výrazů.

    Základy syntaxe

    V krátkém článku nelze podrobně popsat celou syntaxi regulárních výrazů, existuje na to speciální literatura. Uvádíme pouze hlavní prvky, abychom ukázali široké možnosti pro vývojáře a porozuměli příkladům kódu.

    B je formálně definováno velmi složitým způsobem, takže popis zjednodušíme. Regulární výraz je textový řetězec. Skládá se z ohraničeného vzoru a modifikátoru udávajícího, jak jej zpracovat. Do šablon je možné zahrnout různé alternativy a opakování.

    Například ve výrazu /\d(3)-\d(2)-\d(2)/m oddělovač bude «/» , pak následuje vzor a symbol "m" bude modifikátorem.

    Veškerá síla regulárních výrazů je zakódována pomocí metaznaků. Hlavním metaznakem jazyka je zpětné lomítko - „\“. Obrátí typ znaku, který za ním následuje (tj. z běžného znaku se stane metaznak a naopak). Dalším důležitým metaznakem je lomítko "|", které specifikuje alternativní varianty vzoru. Další příklady metaznaků:

    PHP při zpracování regulárních výrazů zachází s mezerou jako se samostatným významným znakem, proto se výrazy ABCWHERE a ABCWHERE liší.

    Dílčí vzory

    V PHP jsou pravidelné podvzorce odděleny závorkami a někdy se jim říká „podvýrazy“. Proveďte následující funkce:

      Zvýraznění alternativ. Například šablona teplo(něco|pták|) odpovídá slovům "teplo", "ohnivý pták" A "pečeně". A bez závorek by to byl jen prázdný řetězec, „pták“ a „pečeně“.

      "Vzrušující" dílčí vzor. To znamená, že pokud se ve vzoru shoduje podřetězec, vrátí se jako výsledek všechny shody. Pro názornost uveďme příklad. Vzhledem k následujícímu regulárnímu výrazu: vítěz obdrží((zlatý|pozlacený)(medaili|pohár)) - a řádek pro nalezení shod: "vítěz obdrží zlatou medaili". Kromě původní fráze výsledek vyhledávání vrátí: "Zlatá medaile", "medaile", "zlato".

    Operátory opakování (kvadrifikátory)

    Při psaní regulárních výrazů je často nutné analyzovat opakování čísel a symbolů. To není problém, pokud není příliš mnoho opakování. Co ale dělat, když neznáme jejich přesný počet? V tomto případě musíte použít speciální metaznaky.

    K popisu opakování se používají kvadrifikátory - metasymboly pro upřesnění množství. Kvadrifikátory jsou dvou typů:

    • obecné, v závorkách;
    • zkrácený.

    Obecný kvantifikátor udává minimální a maximální počet povolených opakování prvku, vyjádřený jako dvě čísla ve složených závorkách, takto: x(2,5). Pokud není znám maximální počet opakování, druhý argument je vynechán: x(2,).

    Zkratkové kvantifikátory představují symboly pro nejběžnější opakování, aby se předešlo zbytečnému zmatku v syntaxi. Běžně se používají tři zkratky:

    1. * - nula nebo více opakování, což odpovídá (0,).

    2. + - jedno nebo více opakování, tj. ,).

    3. ? - nula nebo pouze jedno opakování - (0,1).

    Příklady regulárních výrazů

    Pro ty, kteří se učí regulární výrazy, jsou příklady nejlepším návodem. Představíme několik, které s minimálním úsilím ukazují své široké možnosti. Všechny programové kódy jsou plně kompatibilní s PHP verze 4.xa vyšší. Pro plné pochopení syntaxe a využití všech vlastností jazyka doporučujeme knihu J. Friedla “Regular Expressions”, která plně pojednává o syntaxi a obsahuje příklady regulárních výrazů nejen v PHP, ale také pro Python, Perl, MySQL, Java, Ruby a C#.

    Kontrola správnosti e-mailové adresy

    Úkol. Existuje internetová stránka, která žádá návštěvníka o e-mailovou adresu. Regulární výraz musí před odesláním zpráv zkontrolovat správnost přijaté adresy. Kontrola nezaručuje, že zadaná poštovní schránka skutečně existuje a přijímá dopisy. Může ale vyřadit zjevně nesprávné adresy.

    Řešení. Stejně jako u jakéhokoli programovacího jazyka lze regulární výrazy pro ověřování e-mailových adres v PHP implementovat mnoha způsoby a příklady v tomto článku nejsou vše. Proto v každém případě uvedeme seznam požadavků, které je třeba při programování zohlednit a konkrétní implementace závisí zcela na vývojáři.

    Takže výraz, který kontroluje, zda je e-mail platný, musí zkontrolovat následující podmínky:

    1. Přítomnost symbolu @ ve zdrojovém řetězci a absence mezer.
    2. Doménová část adresy následovaná symbolem @ obsahuje pouze platné znaky pro názvy domén. Totéž platí pro uživatelské jméno.
    3. Při kontrole uživatelského jména musíte hledat speciální znaky, jako je apostrof nebo Tyto znaky jsou potenciálně nebezpečné a lze je použít při útocích, jako je SQL injection. Vyhněte se takovým adresám.
    4. Uživatelská jména povolují pouze jednu tečku, která nemůže být prvním ani posledním znakem na řádku.
    5. Název domény musí obsahovat alespoň dva a ne více než šest znaků.

    Příklad, který zohledňuje všechny tyto podmínky, je vidět níže na obrázku.

    Kontrola platnosti adres URL

    Úkol. Kontrola platnosti daného textového řetězce Regulární výrazy pro kontrolu URL lze opět implementovat různými způsoby.

    Řešení. Naše finální verze vypadá takto:

    /^(https?:\/\/)?([\da-z\.-]+)\.((2,6))([\/\w \.-]*)*\/?$ /

    Nyní se podívejme na jeho součásti podrobněji pomocí obrázku.

    Kontrola čísel kreditních karet

    Úkol. U nejběžnějších platebních systémů je nutné zkontrolovat správnost zadaného čísla plastové karty. Možnost zvažována pouze pro karty

    Řešení. Při vytváření výrazu musíte počítat s možnou přítomností mezer v zadaném čísle. Čísla na kartě jsou rozdělena do skupin pro usnadnění čtení a diktování. Je tedy zcela přirozené, že se člověk může pokusit zadat číslo tímto způsobem (tj. pomocí mezer).

    Napsat univerzální výraz, který bere v úvahu možné mezery a pomlčky, je obtížnější než prosté vyřazení všech znaků kromě čísel. Proto se doporučuje použít ve výrazu metaznak /D, který odstraní všechny znaky kromě čísel.

    Nyní můžete přejít přímo ke kontrole čísla. Všechny společnosti vydávající kreditní karty používají jedinečný formát čísel. Příklad to využívá a klient nemusí zadávat název společnosti - je určen číslem. Karty Visa vždy začínají 4 a mají délku čísla 13 nebo 16 číslic. MasterCard začíná v rozsahu 51-55 s délkou čísla 16. Výsledkem je následující výraz:

    Před zpracováním objednávky můžete provést dodatečnou kontrolu poslední číslice čísla, která je vypočtena pomocí Luhnova algoritmu.

    Kontrola telefonních čísel

    Úkol. Kontrola správnosti zadaného telefonního čísla.

    Řešení. Počet číslic v číslech pevných linek a mobilních telefonů se v jednotlivých zemích výrazně liší, takže není možné univerzálně ověřit správnost telefonního čísla pomocí regulárních výrazů. Mezinárodní čísla však mají přísný formát a jsou skvělá pro kontrolu šablon. Navíc se stále více národních telefonních operátorů snaží dodržovat jednotný standard. Struktura čísla je následující:

    +CCC.NNNNNNNNNNxEEEE, Kde:

    C je kód země, který se skládá z 1–3 číslic.

    N - číslo dlouhé až 14 číslic.

    E - volitelné rozšíření.

    Plus je povinný prvek a znaménko x je přítomno pouze v případě, že je nutné rozšíření.

    V důsledku toho máme následující výraz:

    ^\+(1,3)\.(4,14)(?:x.+)?$

    Čísla v rozsahu

    Úkol. Musíte odpovídat celému číslu v určitém rozsahu. Navíc je nutné, aby regulární výrazy odpovídaly pouze číslům z rozsahu hodnot.

    Řešení. Zde jsou některé výrazy pro několik nejběžnějších případů:

    Zjištění IP adresy

    Úkol. Musíte určit, zda je daný řetězec platnou IP adresou ve formátu IPv4 v rozsahu 000.000.000.000-255.255.255.255.

    Řešení. Jako u každé úlohy v PHP mají regulární výrazy mnoho variant. Například toto:

    Online kontrola výrazů

    Testování správnosti regulárních výrazů může být pro nové programátory obtížné kvůli složitosti syntaxe, která se liší od „běžných“ programovacích jazyků. K vyřešení tohoto problému existuje mnoho online testerů výrazů, které usnadňují kontrolu správnosti vytvořené šablony na skutečném textu. Programátor zadá výraz a data, která mají být testována, a okamžitě vidí výsledek zpracování. Obvykle je zde také referenční část, kde jsou podrobně popsány regulární výrazy, příklady a implementační rozdíly pro nejběžnější programovací jazyky.

    Ale zcela důvěřovat výsledkům online služeb se nedoporučuje všem vývojářům používajícím PHP. Regulární výraz, psaný a testovaný osobně, zlepšuje vaši dovednost a zaručuje absenci chyb.

    Regulární výrazy jsou speciální vzory pro hledání podřetězců v textu. S jejich pomocí můžete vyřešit následující problémy na jednom řádku: „zkontrolovat, zda řetězec obsahuje čísla“, „najít v textu všechny e-mailové adresy“, „nahradit několik po sobě jdoucích otazníků jedním“.

    Začněme jednou populární programátorskou moudrostí:

    Někteří lidé, když stojí před problémem, si pomyslí: „Jo, jsem chytrý, vyřeším to pomocí regulárních výrazů.“ Nyní mají dva problémy.

    Příklady šablon

    Začněme několika jednoduchými příklady. První výraz na obrázku níže hledá sekvenci 3 písmen, kde první písmeno je „k“, druhé je jakékoli ruské písmeno a třetí je „t“ bez ohledu na velká a malá písmena (například „kočka“ nebo „KOT “ odpovídá tomuto vzoru). Druhý výraz hledá v textu čas ve formátu 12:34.

    Jakýkoli výraz začíná oddělovacím znakem. Obvykle se jako to používá symbol /, ale můžete použít i jiné symboly, které nemají v regulárních výrazech zvláštní účel, například ~, # nebo @. Alternativní oddělovače se používají, pokud se ve výrazu může objevit znak /. Pak následuje vzor řetězce, který hledáme, následuje druhý oddělovač a na konci může být jedno nebo více vlajkových písmen. Určují další možnosti při hledání textu. Zde jsou příklady vlajek:

    • i - říká, že vyhledávání by mělo nerozlišovat malá a velká písmena (ve výchozím nastavení rozlišují malá a velká písmena)
    • u - říká, že hledaný výraz a text používají kódování utf-8, nikoli pouze latinská písmena. Bez něj nemusí vyhledávání ruských (a jakýchkoliv jiných nelatinských) znaků fungovat správně, proto byste jej měli vždy nastavit.

    Samotná šablona se skládá z běžných postav a speciálních konstrukcí. No, například písmeno „k“ v regulárních výrazech znamená samo sebe, ale symboly znamenají „na tomto místě může být jakékoli číslo od 0 do 5“. Zde je úplný seznam speciálních znaků (v manuálu PHP se jim říká metaznaky) a všechny ostatní znaky v pravidelném pořadí jsou běžné:

    Níže analyzujeme význam každého z těchto znaků (a také vysvětlíme, proč je písmeno „е“ umístěno samostatně v prvním výrazu), ale nyní zkusme použít naše regulární výrazy na text a uvidíme, co se stane. PHP má speciální funkci preg_match($regexp, $text, $match), která jako vstup bere regulární výraz, text a prázdné pole. Zkontroluje, zda text obsahuje podřetězec, který odpovídá danému vzoru, a vrátí 0, pokud ne, nebo 1, pokud existuje. A v předaném poli je první nalezená shoda s pravidelnou sekvencí umístěna do prvku s indexem 0. Pojďme napsat jednoduchý program, který aplikuje regulární výrazy na různé řetězce:

    Po zhlédnutí příkladu si regulární výrazy prostudujeme podrobněji.

    Závorky v regulárních výrazech

    Podívejme se, co znamenají různé typy závorek:

    • Složené závorky a(1,5) určují počet opakování předchozího znaku - v tomto příkladu výraz hledá 1 až 5 po sobě jdoucích písmen "a"
    • Hranaté závorky znamenají „kterýkoli z těchto znaků“, v tomto případě písmena a, b, c, x, y, z nebo číslo od 0 do 5. Jiné speciální znaky jako | nebo * - označují běžný znak. Pokud je na začátku hranatých závorek symbol ^, pak se význam změní na opačný: „jakýkoli jeden znak kromě uvedených“ - například [^a-c] znamená „jakýkoli znak kromě a, b nebo c“.
    • Závorky seskupují znaky a výrazy. Například ve výrazu abc+ znaménko plus odkazuje pouze na písmeno c a tento výraz hledá slova jako abc, abcc, abccc. A pokud dáte závorky a(bc)+, pak kvantifikátor plus odkazuje na sekvenci bc a výraz hledá slova abc, abcbc, abcbcbc

    Poznámka: můžete zadat rozsahy znaků v hranatých závorkách, ale pamatujte, že ruské písmeno е je oddělené od abecedy a pro napsání „libovolného ruského písmene“ musíte napsat [a-яе].

    Bexslashes

    Pokud jste se dívali na jiné návody na regulární výrazy, pravděpodobně jste si všimli, že zpětné lomítko se všude píše jinak. Někde píšou jedno zpětné lomítko: \d , ale tady se to v příkladech opakuje 2x: \\d . Proč?

    Jazyk regulárních výrazů vyžaduje, abyste jednou napsali zpětné lomítko. Nicméně v řetězcích v jednoduchých a dvojitých uvozovkách v PHP má zpětné lomítko také speciální význam: manuál o řetězcích. No, například, když napíšete $x = "\$"; pak to PHP bude považovat za speciální kombinaci a vloží do řetězce pouze znak $ (a modul regulárních výrazů nebude vědět o zpětném lomítku před ním). Pro vložení sekvence \$ do řetězce musíme zdvojnásobit zpětné lomítko a napsat kód jako $x = "\\$"; .

    Z tohoto důvodu jsme v některých případech (kde má sekvence znaků v PHP zvláštní význam) povinni zdvojnásobit zpětné lomítko:

    • Abychom zapsali \$ do regulárního výrazu, zapíšeme do kódu "\\$".
    • Chcete-li napsat \\ v regulárním výrazu, zdvojnásobíme každé zpětné lomítko a zapíšeme "\\\\"
    • Chcete-li zapsat zpětné lomítko a číslo (\1) v běžném formátu, musíte zpětné lomítko zdvojnásobit: "\\1"

    V ostatních případech jedno nebo dvě zpětná lomítka dají stejný výsledek: "\\d" a "\d" vloží do řádku dvojici znaků \d - v prvním případě jsou 2 zpětná lomítka sekvence pro vložení zpětného lomítka , ve druhém případě není žádná speciální sekvence a znaky budou vloženy tak, jak jsou. Můžete zkontrolovat, které znaky budou vloženy do řetězce a co uvidí modul regulárních výrazů pomocí echo: echo "\$"; . Ano, je to těžké, ale co se dá dělat?

    Speciální vzory v běžné sezóně

    • \d hledá libovolnou jednu číslici, \D - libovolný jeden znak kromě číslice
    • \w odpovídá libovolnému písmenu (libovolné abecedy), číslu nebo podtržítku _ . \W odpovídá libovolnému znaku kromě písmene, číslice nebo podtržítka.

    Také existuje vhodná podmínka pro označení hranice slova: \b . Tato konstrukce znamená, že na jedné jeho straně by měl být znak, který je písmeno/číslo/podtržítko (\w), a na druhé straně by měl být znak, který není. Například chceme v textu najít slovo „kočka“. Pokud napíšeme regulární výraz /cat/ui, najde posloupnost těchto písmen kdekoli – například uvnitř slova „dobytek“. Očividně to není to, co jsme chtěli. Pokud k regulárnímu výrazu přidáme okrajovou podmínku slova: /\bcat\b/ui , bude se nyní hledat pouze samostatné slovo „cat“.

    Manuál

    • Syntaxe regulárních výrazů v PHP, podrobný popis

    Regulární výrazy jsou velmi užitečným nástrojem pro vývojáře. Regulární výrazy umožňují kontrolovat, vyhledávat a upravovat správnost textu.
    Tento článek obsahuje některé velmi užitečné výrazy, se kterými často potřebujete pracovat.

    Úvod do regulárních výrazů

    Při prvním seznámení s regulárními výrazy se může zdát obtížné je pochopit a použít. Ve skutečnosti je vše jednodušší, než se zdá. Než se podíváme na složité příklady, podívejme se na základy:

    Funkce pro práci s regulárními výrazy v PHP

    Ověření domény

    Kontrola správného názvu domény.

    $url = "http://example.com/"; if (preg_match("/^(http|https|ftp)://(*(?:.*)+):?(d+)?/?/i", $url)) ( echo "Ok."; ) else ( echo "Chybná adresa URL."; )

    Zvýrazňování slov v textu

    Velmi užitečný regulární výraz pro . Užitečné pro vyhledávání.

    $text = "Ukázka věty, regulární výraz se stal populárním ve webovém programování. Nyní se učíme regulární výraz. Podle wikipedie jsou regulární výrazy (zkráceně regulární výraz nebo regulární výraz, s tvary v množném čísle regulární výrazy, regulární výrazy nebo regulární výrazy) psány ve formálním jazyce, který lze interpretovat procesorem regulárních výrazů"; $text = preg_replace("/b(regex)b/i", " 1", $text); echo $text;

    Zvýraznění výsledků vyhledávání ve WordPressu

    Jak již bylo zmíněno, předchozí příklad je velmi užitečný pro . Pojďme to aplikovat na WordPress. Otevřete soubor search.php, najít funkci nadpis(). Nahraďte jej následujícím:

    Echo $title;

    Nyní před tento řádek vložte kód:

    \0", $title); ?>

    Otevřete soubor styl.css. Přidejte k tomu řádek:

    Strong.search-excerpt ( background: yellow; )

    Získejte všechny obrázky z dokumentu HTML

    Pokud budete někdy potřebovat najít všechny obrázky na stránce HTML, bude se vám hodit následující kód. S ním můžete snadno vytvořit nástroj pro nahrávání obrázků pomocí .

    $obrazky = pole(); preg_match_all("/(img|src)=("|")[^"">]+/i", $data, $media); unset($data); $data=preg_replace("/(img|src)("|"|="|=")(.*)/i","$3",$media); foreach($data as $url) ( $info = pathinfo($url); if (isset($info["rozšíření"])) (($info["rozšíření"] == "jpg") || ($info["rozšíření"] == "jpeg") || ($info["rozšíření"] == "gif") || ($info["rozšíření"] == "png")) array_push($ obrázky, $url);

    Odstranění duplicitních slov (nezávisle na velikosti písmen)

    $text = preg_replace("/s(w+s)1/i", "$1", $text);

    Odstranění duplicitních interpunkčních znamének

    Podobné jako předchozí, ale odstraňuje interpunkční znaménka.

    $text = preg_replace("/.+/i", ".", $text);

    Nalezení značky XML/HTML

    Jednoduchá funkce, která vyžaduje dva argumenty: značku, která má být nalezena, a řetězec obsahující XML nebo HTML.

    Funkce get_tag($tag, $xml) ( $tag = preg_quote($tag); preg_match_all("(<".$tag."[^>]*>(.*?).")", $xml, $odpovídá, PREG_PATTERN_ORDER); vrátit $ shoduje se;

    Nalezení značky XML/HTML s konkrétní hodnotou atributu

    Funkce je podobná předchozí, ale je možné zadat atribut tagu. Například:

    .

    Funkce get_tag($attr, $value, $xml, $tag=null) ( if(is_null($tag)) $tag = "\w+"; jinak $tag = preg_quote($tag); $attr = preg_quote($ attr); $hodnota = preg_citace($hodnota $tag_regex = "/);<(".$tag.")[^>]*$attr\s*=\s*". "(["\"])$value\\2[^>]*>(.*?)<\/\\1>/" preg_match_all($tag_regex, $xml, $matches, PREG_PATTERN_ORDER); return $matches; )

    Hledání hexadecimálních barevných kódů

    Funkce umožňuje vyhledat nebo zkontrolovat správnost hexadecimálních barevných kódů.

    $string = "#555555"; if (preg_match("/^#(?:(?:(3))(1,2))$/i", $string)) ( echo "příklad 6 úspěšný."; )

    Hledání názvu stránky

    Tento kód najde a zobrazí text mezi značkami </i> A <i> HTML stránky.

    $fp = fopen("http://www.catswhocode.com/blog","r"); while (!feof($fp))( $page .= fgets($fp, 4096); ) $titre = eregi(" (.*)",$page,$regs); echo $regs; fclose($fp);

    Analýza protokolů Apache

    Mnoho webových stránek běží na webovém serveru Apache. Pokud váš web také běží na taco serveru, mohou být užitečné následující pravidelné postupy.

    //Protokoly: Webový server Apache // Úspěšné přístupy k html souborům. Užitečné pro počítání zobrazení stránek. "^((?#IP klienta nebo název domény)S+)s+((?#základní ověření)S+s+S+)s+[((?#datum a čas)[^]]+)]s+"(?: GET|POST|HEAD) ((?#file)/[^ ?]+?.html?)??((?#parameters)[^ ?]+)? HTTP/+"s+(?#stavový kód)200s+((?#přenesených bajtů)[-0-9]+)s+"((?#referrer)[^"]*)"s+"((?#uživatelský agent )[^"]*)"$" //Protokoly: webový server Apache //404 chyb "^((?#IP nebo název domény klienta)S+)s+((?#základní ověření)S+s+S+)s+ [((?#datum a čas)[^]]+)]s+"(?:GET|POST|HEAD) ((?#soubor)[^ ?]+)??((?#parametry)[^ ? "]+)? HTTP/+"s+(?#stavový kód)404s+((?#přenesených bajtů)[-0-9]+)s+"((?#referrer)[^"]*)"s+"((?#uživatelský agent )[^"]*)"$")

    Nahrazení dvojitých uvozovek složenými uvozovkami

    preg_replace("B"b([^"x84x93x94rn]+)b"B", "?1?", $text);

    Kontrola složitosti hesla

    Tento regulární výraz kontroluje řetězec bod po bodu: řetězec musí obsahovat alespoň 6 písmen, číslic, podtržítka a pomlčky. Řádek musí obsahovat alespoň jedno velké písmeno, jedno malé písmeno a číslo.

    "A(?=[-_a-zA-Z0-9]*?)(?=[-_a-zA-Z0-9]*?)(?=[-_a-zA-Z0-9]*?) [-_a-zA-Z0-9](6,)z"

    WordPress: Získávání obrázků příspěvků pomocí regulárních výrazů

    Pokud používáte WordPress, možná se vám bude hodit funkce, která získá všechny obrázky z příspěvku a zobrazí je. Chcete-li tento kód použít, zkopírujte jej do souborů motivů.

    post_content; $szSearchPattern = "~ ]* />~"; // Spusťte preg_match_all, chcete-li získat všechny obrázky a uložit výsledky do $aPics preg_match_all($szSearchPattern, $szPostContent, $aPics); // Zkontrolujte, zda máme alespoň 1 obrázek $iNumberOfPics = count($aPics if ($iNumberOfPics > 0) ( // Nyní byste s obrázky udělali vše, co potřebujete // V tomto příkladu jsou obrázky zobrazeny pouze pro ($i=0; $i);< $iNumberOfPics ; $i++) { echo $aPics[$i]; }; }; endwhile; endif; ?>

    Převod emotikonů na obrázky

    Tato funkce je dostupná i ve WordPressu, umožňuje automaticky nahrazovat textové emotikony obrázky.

    $texte="Text se smajlíkem:-)"; echo str_replace(":-)"," ",$texte);