Reguliere expressies in php voor dummies. Reguliere expressiefuncties

Bij het werken met teksten in welke moderne programmeertaal dan ook, worden ontwikkelaars voortdurend geconfronteerd met de taken van het controleren van ingevoerde gegevens op naleving van het gewenste patroon, het zoeken en vervangen van testfragmenten en andere typische bewerkingen voor het verwerken van symbolische informatie. Het ontwikkelen van uw eigen verificatie-algoritmen leidt tot tijdverlies, incompatibiliteit van programmacode en complexiteit bij de ontwikkeling en modernisering ervan.

De snelle ontwikkeling van de internet- en WEB-ontwikkeltalen vereiste de creatie van universele en compacte tools voor het verwerken van tekstinformatie met een minimale hoeveelheid code die hiervoor nodig was. De PHP-taal, populair onder beginners en professionele ontwikkelaars, is daarop geen uitzondering. Reguliere expressie als tekstsjabloontaal stelt u in staat tekstverwerkingstaken te vereenvoudigen en de programmacode met tientallen en honderden regels te verminderen. Zonder dit kunnen veel problemen niet worden opgelost.

Reguliere expressies in PHP

De PHP-taal bevat drie mechanismen voor het werken met reguliere expressies: "ereg", "mb_ereg" en "preg". De meest voorkomende is de "preg"-interface, waarvan de functies toegang bieden tot de PCRE-bibliotheek voor reguliere expressies, oorspronkelijk ontwikkeld voor de Perl-taal, die bij PHP wordt geleverd. Preg-functies zoeken in een bepaalde tekstreeks naar overeenkomsten volgens een specifiek patroon in reguliere expressietaal.

Basisbeginselen van syntaxis

In een kort artikel is het onmogelijk om de hele syntaxis van reguliere expressies in detail te beschrijven; hiervoor bestaat speciale literatuur. We presenteren alleen de belangrijkste elementen om de brede mogelijkheden voor de ontwikkelaar te laten zien en de codevoorbeelden te begrijpen.

B is formeel op een zeer complexe manier gedefinieerd, dus laten we de beschrijving vereenvoudigen. Een reguliere expressie is een teksttekenreeks. Het bestaat uit een afgebakend patroon en een modifier die aangeeft hoe het moet worden verwerkt. Het is mogelijk om diverse alternatieven en herhalingen in de sjablonen op te nemen.

Bijvoorbeeld in de uitdrukking /\d(3)-\d(2)-\d(2)/m de afscheider zal zijn «/» , dan komt het patroon en het symbool "M" zal een modificator zijn.

Alle kracht van reguliere expressies wordt gecodeerd met metatekens. Het belangrijkste metakarakter van de taal is de backslash - “\”. Het keert het type van het personage dat erop volgt om (dat wil zeggen: een gewoon personage wordt een metateken en omgekeerd). Een ander belangrijk metateken is de schuine streep "|", die alternatieve variaties van het patroon specificeert. Meer voorbeelden van metatekens:

PHP behandelt bij het verwerken van reguliere expressies de spatie als een afzonderlijk significant teken, dus de expressies ABCWHERE en ABCWHERE zijn verschillend.

Subpatronen

In PHP worden reguliere subpatronen gescheiden door haakjes en worden ze soms "subexpressies" genoemd. Voer de volgende functies uit:

Alternatieven benadrukken. Bijvoorbeeld sjabloon hitte(iets|vogel|) komt overeen met de woorden "hitte", "vuurvogel" En "gebraden". En zonder de haakjes zou het gewoon een lege string zijn, “bird” en “roast”.

"Spannend" subpatroon. Dit betekent dat als een subtekenreeks overeenkomt in het patroon, alle overeenkomsten als resultaat worden geretourneerd. Laten we voor de duidelijkheid een voorbeeld geven. Gegeven de volgende reguliere expressie: de winnaar ontvangt((gouden|verguld)(medaille|beker)) - en een regel om overeenkomsten te vinden: "de winnaar ontvangt een gouden medaille". Naast de originele zin retourneert het zoekresultaat: "gouden medaille", "medaille", "goud".

Herhalingsoperatoren (kwadratoren)

Bij het schrijven van reguliere expressies is het vaak nodig om herhalingen van cijfers en symbolen te analyseren. Dit is geen probleem als er niet veel herhalingen zijn. Maar wat moeten we doen als we het exacte aantal niet weten? In dit geval moet u speciale metatekens gebruiken.

Om herhalingen te beschrijven, worden kwadratoren gebruikt: metasymbolen om de hoeveelheid te specificeren. Quadrifiers zijn er in twee soorten:

  • algemeen, tussen haakjes;
  • afgekort.

De algemene kwantor specificeert het minimale en maximale aantal toegestane herhalingen van een element, uitgedrukt als twee getallen tussen accolades, zoals dit: x(2,5). Als het maximale aantal herhalingen onbekend is, wordt het tweede argument weggelaten: x(2,).

Verkorte kwantoren vertegenwoordigen symbolen voor de meest voorkomende herhalingen om onnodige syntaxisrommel te voorkomen. Drie afkortingen worden vaak gebruikt:

1. * - nul of meer herhalingen, wat overeenkomt met (0,).

2. + - een of meer herhalingen, d.w.z. ,).

3. ? - nul of slechts één herhaling - (0,1).

Voorbeelden van reguliere expressies

Voor degenen die reguliere expressies leren, zijn voorbeelden de beste tutorial. We zullen er een paar presenteren die met een minimum aan inspanning hun brede capaciteiten laten zien. Alle programmacodes zijn volledig compatibel met PHP-versies 4.x en hoger. Om de syntaxis volledig te begrijpen en alle functies van de taal te gebruiken, raden we het boek "Regular Expressions" van J. Friedl aan, waarin de syntaxis volledig wordt besproken en voorbeelden van reguliere expressies worden gegeven, niet alleen in PHP, maar ook voor Python, Perl, MySQL, Java, Ruby en C#.

Controle van de juistheid van het e-mailadres

Taak. Er is een internetpagina die de bezoeker om een ​​e-mailadres vraagt. De reguliere expressie moet controleren of het ontvangen adres correct is voordat berichten worden verzonden. De controle garandeert niet dat de opgegeven mailbox daadwerkelijk bestaat en brieven accepteert. Maar het kan duidelijk onjuiste adressen verwijderen.

Oplossing. Zoals bij elke programmeertaal kunnen reguliere expressies voor PHP-e-mailadresverificatie op een aantal manieren worden geïmplementeerd, en de voorbeelden in dit artikel zijn niet alles. Daarom zullen we in elk geval een lijst met vereisten geven waarmee rekening moet worden gehouden bij het programmeren, en de specifieke implementatie hangt volledig af van de ontwikkelaar.

Een expressie die controleert of een e-mail geldig is, moet dus aan de volgende voorwaarden voldoen:

  • De aanwezigheid van het @-symbool in de bronreeks en de afwezigheid van spaties.
  • Het domeingedeelte van het adres, gevolgd door het @-symbool, bevat alleen geldige tekens voor domeinnamen. Hetzelfde geldt voor de gebruikersnaam.
  • Bij het controleren van een gebruikersnaam moet u letten op speciale tekens, zoals een apostrof of Deze tekens zijn potentieel gevaarlijk en kunnen worden aangetroffen bij aanvallen zoals SQL-injectie. Vermijd dergelijke adressen.
  • Bij gebruikersnamen is slechts één punt toegestaan. Deze mag niet het eerste of het laatste teken op de regel zijn.
  • De domeinnaam moet minimaal twee en maximaal zes tekens bevatten.
  • Een voorbeeld dat met al deze voorwaarden rekening houdt, ziet u hieronder in de afbeelding.

    Controle van de geldigheid van URL's

    Taak. Controleer of een bepaalde tekstreeks geldig is. Ook hier kunnen reguliere expressies voor URL-controle op verschillende manieren worden geïmplementeerd.

    Oplossing. Onze definitieve versie ziet er als volgt uit:

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

    Laten we nu de componenten in meer detail bekijken met behulp van de figuur.

    Creditcardnummers controleren

    Taak. Voor de meest voorkomende betalingssystemen is het noodzakelijk om de juistheid van het ingevoerde plastic kaartnummer te controleren. Optie alleen overwogen voor kaarten

    Oplossing. Bij het maken van een uitdrukking moet u rekening houden met de mogelijke aanwezigheid van spaties in het ingevoerde getal. De cijfers op de kaart zijn in groepen verdeeld om het lezen en dicteren gemakkelijker te maken. Daarom is het heel normaal dat iemand probeert het getal op deze manier in te voeren (dat wil zeggen met spaties).

    Het schrijven van een universele uitdrukking die rekening houdt met mogelijke spaties en koppeltekens is moeilijker dan simpelweg alle tekens weggooien, behalve cijfers. Daarom wordt aanbevolen om het metateken /D in de expressie te gebruiken, waardoor alle tekens behalve cijfers worden verwijderd.

    Nu kunt u direct doorgaan met het controleren van het nummer. Alle creditcardmaatschappijen gebruiken een uniek getalformaat. In het voorbeeld wordt hiervan gebruik gemaakt en de klant hoeft de bedrijfsnaam niet in te voeren; deze wordt bepaald door het nummer. Visa-kaarten beginnen altijd met 4 en hebben een nummerlengte van 13 of 16 cijfers. MasterCard begint in het bereik 51-55 met een getallengte van 16. Als resultaat krijgen we de volgende uitdrukking:

    Voordat u een bestelling verwerkt, kunt u een extra controle uitvoeren op het laatste cijfer van het nummer, dat wordt berekend met behulp van het Luhn-algoritme.

    Telefoonnummers controleren

    Taak. Controle van de juistheid van het ingevoerde telefoonnummer.

    Oplossing. Het aantal cijfers in vaste en mobiele telefoonnummers varieert aanzienlijk van land tot land, dus het is niet mogelijk om universeel te controleren of een telefoonnummer correct is met behulp van reguliere expressies. Maar internationale nummers hebben een strikt formaat en zijn ideaal voor het controleren van sjablonen. Bovendien proberen steeds meer nationale telefoonoperatoren aan één enkele standaard te voldoen. De structuur van het nummer is als volgt:

    +CCC.NNNNNNNNNNxEEEE, Waar:

    C is de landcode, bestaande uit 1-3 cijfers.

    N - nummer van maximaal 14 cijfers.

    E - optionele verlenging.

    De plus is een verplicht element en het x-teken is alleen aanwezig als uitbreiding nodig is.

    Als resultaat hebben we de volgende uitdrukking:

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

    Cijfers binnen bereik

    Taak. U moet een geheel getal binnen een specifiek bereik matchen. Bovendien is het noodzakelijk dat de reguliere expressies alleen overeenkomen met getallen uit een reeks waarden.

    Oplossing. Hier zijn enkele uitdrukkingen voor enkele van de meest voorkomende gevallen:

    Een IP-adres zoeken

    Taak. U moet bepalen of de opgegeven string een geldig IP-adres in IPv4-formaat is in het bereik 000.000.000.000-255.255.255.255.

    Oplossing. Zoals bij elke taak in PHP kennen reguliere expressies veel variaties. Dit is bijvoorbeeld:

    Online expressiecontrole

    Het testen van reguliere expressies op juistheid kan voor nieuwe programmeurs moeilijk zijn vanwege de complexiteit van de syntaxis, die verschilt van ‘gewone’ programmeertalen. Om dit probleem op te lossen, zijn er veel online expressietesters die het gemakkelijk maken om de juistheid van de gemaakte sjabloon op echte tekst te controleren. De programmeur voert de uitdrukking en gegevens in die moeten worden getest en ziet onmiddellijk het verwerkingsresultaat. Meestal is er ook een referentiesectie waar reguliere expressies, voorbeelden en implementatieverschillen voor de meest voorkomende programmeertalen gedetailleerd worden beschreven.

    Maar volledig vertrouwen op de resultaten van online services wordt niet aanbevolen voor alle ontwikkelaars die PHP gebruiken. Een reguliere expressie, persoonlijk geschreven en getest, verbetert uw vaardigheden en garandeert de afwezigheid van fouten.

    Reguliere expressies zijn een zeer nuttig hulpmiddel voor ontwikkelaars. Ze kunnen worden gebruikt om tekst, woorden of andere tekens te vinden, identificeren of vervangen. Het artikel van vandaag bevat 15 van de nuttigste reguliere expressies die nuttig zullen zijn voor elke webontwikkelaar.

    Inleiding tot reguliere expressies

    Veel nieuwe ontwikkelaars vinden reguliere expressies erg moeilijk te begrijpen en te gebruiken. In feite is alles niet zo moeilijk als het lijkt. Voordat we ingaan op de reguliere expressies zelf, met hun nuttige en veelzijdige code, gaan we eerst eens kijken naar de basisprincipes:

    Syntaxis van reguliere expressies

    Reguliere expressie Middelen
    foe Tekenreeks “foo”
    ^ foe De regel begint met "foo"
    foo$ De regel eindigt met "foo"
    ^foo$ "foo" komt slechts één keer per regel voor
    a, b of c
    elk klein letterteken
    [^A-Z] elk teken dat geen hoofdletter is
    (gif|jpg) Betekent zowel “gif” als “jpeg”
    + Een of meer kleine letters
    Elk getal, punt of minteken
    ^{1,}$ Elk woord, minstens één letter, cijfer of _
    ()() wy, wz, xy of xz
    (^A-Za-z0-9) Elk teken (geen cijfer of letter)
    ({3}|{4}) Betekent drie letters of vier cijfers

    PHP-functies voor reguliere expressies

    Functie Beschrijving
    preg_match() De functie preg_match() zoekt naar een string met behulp van een bepaald patroon, retourneert true als de string wordt gevonden en false anders
    preg_match_all() De functie preg_match_all() vindt alle exemplaren van een string op basis van een patroon
    preg_replace() De functie preg_replace() werkt volgens hetzelfde principe als ereg_replace(), behalve dat reguliere expressies kunnen worden gebruikt om zowel het zoekpatroon als de tekenreeks te specificeren waarmee de gevonden waarde moet worden vervangen.
    preg_split() De functie preg_split() werkt hetzelfde als split(), behalve dat een reguliere expressie kan worden gebruikt als parameter voor het zoekpatroon.
    preg_grep() De functie preg_grep() doorzoekt alle elementen van de invoerarray en retourneert alle elementen die overeenkomen met het reguliere expressiepatroon.
    preg_quote() Ontsnapt aan reguliere expressietekens
    Verificatie van domeinnaam

    Controleren of een string een geldige domeinnaam is

    $url = "http://komunitasweb.com/"; if (preg_match("/^(http|https|ftp)://(*(?:.*)+):?(d+)?/?/i", $url)) ( echo "Je URL is ok ."; ) else ( echo "Verkeerde url."; )

    Een woord in de tekst markeren

    Dit is een zeer nuttige reguliere expressie, met zijn hulp kunt u het gewenste woord vinden en markeren. Vooral handig voor het weergeven van zoekresultaten.

    $text = "Voorbeeldzin van KomunitasWeb, regex is populair geworden in webprogrammering. Nu leren we regex. Volgens wikipedia worden reguliere expressies (afgekort als regex of regexp, met meervoudsvormen regexes, regexps of regexen) geschreven in een formele vorm taal die kan worden geïnterpreteerd door een reguliere-expressieprocessor"; $text = preg_replace("/b(regex)b/i", "1", $text); echo $tekst;

    Zoekresultaten markeren in een WordPress-blog

    Zoals vermeld in het vorige voorbeeld, is dit codevoorbeeld handig om te gebruiken in zoekresultaten en is het een geweldige manier om deze functie in een WordPress-blog te implementeren.

    Open uw search.php-bestand en zoek de functie_title(). Vervang het door de volgende code:

    Echo $titel;

    Voeg nu boven deze regel deze code toe:

    Sla het search.php-bestand op en open style.css. Voeg de volgende regel toe:

    Strong.search-fragment ( achtergrond: geel; )

    Alle afbeeldingen uit een HTML-document halen

    Als u ooit alle afbeeldingen van een webpagina wilt hebben, is deze code een must. U kunt eenvoudig een afbeeldingsdownloader maken met behulp van de kracht van cURL

    $afbeeldingen = array(); preg_match_all("/(img|src)=("|\")[^"\">]+/i", $data, $media); uitgeschakeld($data); $data = preg_replace("/(img|src)("|\"|="|=\")(.*)/i", "$3", $media); foreach ($data as $url) ( $info = pathinfo($url); if (isset($info["extension"])) ( if (($info["extension"] == "jpg") || ($info["extensie"] == "jpeg") || ($info["extensie"] == "gif") || ($info["extensie"] == "png")) array_push($ afbeeldingen, $url);

    Dubbele woorden verwijderen (niet hoofdlettergevoelig)

    Worden woorden tijdens het typen vaak herhaald? Deze reguliere expressie zal helpen.

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

    Dubbele interpunctie verwijderen

    Hetzelfde, alleen voor interpunctie. Zeg vaarwel tegen dubbele komma's.

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

    Zoeken in XML/HTML-tags

    Deze eenvoudige functie heeft twee argumenten nodig. De eerste is de tag die je moet vinden, en de tweede is een variabele die de XML of HTML bevat. Nogmaals, deze functie is erg handig om te gebruiken in combinatie met cURL.

    Functie get_tag($tag, $xml) ( $tag = preg_quote($tag); preg_match_all("(]*>(.*?).")", $xml, $matches, PREG_PATTERN_ORDER); return $matches; )

    Zoek naar XHTML/XML-tags met een specifieke attribuutwaarde

    Deze functie lijkt erg op de vorige, behalve dat je de tag het gewenste attribuut kunt geven. U kunt bijvoorbeeld gemakkelijk vinden.

    Functie get_tag($attr, $value, $xml, $tag=null) ( if(is_null($tag)) $tag = "\w+"; else $tag = preg_quote($tag); $attr = preg_quote($ attr); $waarde = preg_quote($waarde); $tag_regex = "/]*$attr\s*=\s*". .*?)/" preg_match_all($tag_regex, $xml, $matches, PREG_PATTERN_ORDER); retourneert $matches; )

    Hexadecimale kleurwaarden vinden

    Nog een handig hulpmiddel voor webontwikkelaars! Hiermee kunt u hexadecimale kleurwaarden vinden/controleren.

    $string = "#555555"; if (preg_match("/^#(?:(?:(3))(1,2))$/i", $string)) ( echo "voorbeeld 6 succesvol."; )

    Zoek artikeltitel

    Met dit codefragment wordt de tekst in tags op een HTML-pagina gevonden en weergegeven.

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

    Apache-logboeken parseren

    De meeste sites draaien op de bekende Apache-webserver. Als uw site daar één van is, waarom gebruikt u dan niet PHP en reguliere expressies om Apache-logboeken te parseren?

    //Logs: Apache-webserver //Alleen succesvolle treffers voor HTML-bestanden. Handig voor het tellen van het aantal pageviews. "^((?#client IP of domeinnaam)S+)s+((?#basisauthenticatie)S+s+S+)s+[((?#datum en tijd)[^]]+)]s+"(?: GET|POST|HEAD) ((?#file)/[^ ?]+?.html?)??((?#parameters)[^ ?]+)? HTTP/+"s+(?#statuscode)200s+((?#bytes overgedragen)[-0-9]+)s+"((?#referrer)[^"]*)"s+"((?#user-agent )[^"]*)"$" //Logboeken: Apache-webserver //404-fouten alleen "^((?#client IP of domeinnaam)S+)s+((?#basisverificatie)S+s+S+) s+[((?#datum en tijd)[^]]+)]s+"(?:GET|POST|HEAD) ((?#bestand)[^ ?"]+)??((?#parameters)[ ^ ?"]+)? HTTP/+"s+(?#statuscode)404s+((?#bytes overgedragen)[-0-9]+)s+"((?#referrer)[^"]*)"s+"((?#user-agent )[^"]*)"$"

    Dubbele aanhalingstekens vervangen door slimme aanhalingstekens

    Als u een liefhebber bent van typografie, zult u dol zijn op deze reguliere expressie die gewone dubbele aanhalingstekens vervangt door slimme aanhalingstekens. Een vergelijkbare reguliere expressie wordt in WordPress gebruikt in pagina-inhoud.

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

    Uitgebreide wachtwoordverificatie

    Deze reguliere expressie zorgt ervoor dat er minimaal zes tekens, cijfers, koppeltekens en onderstrepingstekens in het tekstveld worden ingevoerd.

    Het tekstveld moet minimaal één hoofdletter, één kleine letter en één cijfer bevatten.

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

    WordPress: reguliere expressie gebruiken om afbeeldingen uit een bericht te halen

    Omdat velen van jullie WordPress-gebruikers zijn, heb je mogelijk een code nodig waarmee je alle afbeeldingen uit de tekst van een artikel kunt halen en weergeven.

    Om deze code te gebruiken, plakt u deze eenvoudig in een bestand in uw thema.