Hoe mijn reguliere expressie te krijgen om informatie te extraheren, niet alleen controleren

Ik heb een reguliere expressie om te controleren of een string een postcode is of niet. Maar ik zou ook graag dat van een volledig adres (of, indien mogelijk, elke string) kunnen extraheren.

Dit is mijn huidige reguliere expressie:

/^((\d{5}-\d{4})|(\d{5})|([a-zA-Z]\d[a-zA-Z]\s\d[a-zA-Z]\d)|([a-zA-Z]\d[a-zA-Z]\d[a-zA-Z]\d))$/

Indien nodig ben ik bereid om genoegen te nemen met een functie (ik controleer met PHP) maar ik doe liever dat de regexp het werk doet, indien mogelijk.

1

3 antwoord

PHP extraheert de groeperingen in () in een array met preg_match() :

$matches = array();
$pattern = "/^((\d{5}-\d{4})|(\d{5})|([a-zA-Z]\d[a-zA-Z]\s\d[a-zA-Z]\d)|([a-zA-Z]\d[a-zA-Z]\d[a-zA-Z]\d))$/";
preg_match($pattern, $your_source, $matches);
print_r($matches);
2
toegevoegd
Ja, dat wist ik. Maar het helpt me niet om die regexp uit een grotere string te extraheren; alleen variabelen van binnen de regexp
toegevoegd de auteur Martin, de bron

preg_match, which I assume you're already using when you're checking a string against your regular expression, also gives you back the actual text that matched your pattern.

preg_match($regex, $input, $matches);
echo $matches[0];

Het derde argument is gevuld met de resultaten van het proberen om de regex aan te passen aan jouw invoer. $ komt overeen met [0] bevat tekst die overeenkomt met het hele patroon, terwijl hogere indexen tekst bevatten die overeenkomt met het vastleggen van subpatronen (de delen van het patroon tussen haakjes).

In uw geval heeft u echter uw patroon ingesloten met de begin-van-invoer ^ en end-of-input $ tekens, wat betekent dat elke overeenkomst moet bevatten de gehele invoertekenreeks (of een volledige regel in multilijnmodus). Je moet eerst de ^ en $ verwijderen voordat je dit patroon probeert te gebruiken om een ​​postcode uit een grotere reeks te extraheren.

2
toegevoegd
Perfect! Je hebt gelijk, ik gebruikte preg_match() en groepeerde de variabelen in een array, dankzij de derde parameter. Maar de informatie over de ^ en $ is wat ik nodig had
toegevoegd de auteur Martin, de bron

Omdat u met een volledig adres werkt, kunt u een beroep doen op een service die een adres nauwkeurig kan uitlezen en verifiëren en zijn componenten (inclusief de volledige postcode) kan analyseren en een goed antwoord kan bieden? Het zou zeker raden elimineren. De screenshot hieronder toont een tool van SmartyStreets die adressen uit allerlei soorten tekst kan extraheren. In het belang van volledige openbaarmaking ben ik een softwareontwikkelaar op SmartyStreets .

https://smartystreets.com/account/extract

LiveAddress extraction

0
toegevoegd