11 oktober 2008

WEB GREP


Nog even twee aardige GREP uitdrukkingen om alle email adressen en alle hyperlinks te vinden in een tekst.

Uiteraad geldt dat als je opmaak aan het gevonden resultaat wilt toekennen (bijvoorbeeld een cursief of een kleur) dat je bij het vervangen veld op moet geven:
$1
(zie eerdere GREP berichten op deze blog)

Om elk email adres te vinden (ongeacht wat voor @ teken komt),

^(.+@)

Geef je bijvoorbeeld bij vervangen op:
Email: $1

Dan zal voor elk email adres de tekst email: worden toegevoegd.



Deze string vindt echter alleen de tekst voor het @ teken. Wil je het hele adres cursiveren dan moet jee een andere zoekstring vinden die ook de tekens na het @ teken vindt:

^(.+@.+)

Beide email GREP varianten gaan uit van het email adres aan het begin van een alinea (het ^ teken).
Wil je alle email adressen in lopende tekst vinden, dan wordt het wat ingewikkelder:

([\w-]+(?:\.[\w-]+)*@(?:[\w-]+\.)+[a-zA-Z]{2,7})

(De ronde teksthaakjes aan het begin en aan het eind van deze GREP uitdrukking dienen om $1 te definiëren voor het geval je deze adressen bijvoorbeeld wilt cursiveren. Wil je ze alleen zoeken dan kun je de haakjes weglaten.)
Hierboven is elk mogelijk voorkomend teken gedefinieerd , behalve spaties ed ([\w-]+(?:\.[\w-]+) een of meer kerengevolgd door altijd het @ teken @, gevolgd door weer elk mogelijk teken behalve spaties ed maar beperkt tot een aantal tekens (?:[\w-]+\.)+[a-zA-Z]{2,7}).

Maar zo'n email GREP laat zich ook anders, en daarmee stukken korter en gemakkelijker definiëren als:

[\S]+[@][\S]+

Bovenstaande vindt dus ook elk email adres! Zo zie je dat GREP enorm flexibel is!
[\S] betekent: Elk karakter dat geen spatie is en vervangt daarmee de hele GREP string in het eerste voorbeeld waarin alle tekens eigenlijk afzonderlijk als mogelijk voorkomend werden gedefinieerd! [] geeft de beperking tot deze tekens aan, een of meer keren: +, gevolgd door altijd het @ teken [@], gevolgd door elk teken dat geen spatie is, een of meer keren +. Dit werkt omdat email adressen altijd eigenlijk één (aan elkaar geschreven) woord is.


Om elk webadres (hyperlink) te vinden, kun je deze GREP gebruiken:

(?i)(http|ftp|www)(\S+)|(\S+) (\.gov|\.us|\.net|\.com|\.edu|\.org|\.biz\|.nl)

(?i) betekent zowel kapitaal als onderkast ('case insensitive on')

Nadeel van de bovenstaande uitdrukking is dat je elke gewenste extensie (.com, .nl etc.) in de GREP uitdrukking moet opgeven. |\.com bijvoorbeeld. het teken | betekent OF/MOET voorkomen. 

Vandaar dat je ook een andere GREP kunt gebruiken die dit ondervangt en 'universeler' is:

(?i)(http|ftp|www)(\S+)(\.\l{2,4})|(\S+)(\.\l{2,4})

In de bovenstaande GREP wordt de conditie van een punt en daarna 2 tot 4 tekens vastgelegd. Zo vang je dus elke extensie in één uitdrukking! 
Eerst wordt onderkast/kapitaal beide aangezet , (?i) vervolgens drie mogelijke beginuitdrukkingen gegeven (http|ftp|www), gevolgd door elk teken behalve de spatie een of meer keren mogelijk (\S+), gevolgd door altijd een punt \., gevolgd door mogelijk 2-4 tekens l{2,4} OF elk teken behalve een spatie een of meer keren (\S+), gevolgd een punt \. en 2-4 tekens {2,4}.
(Aangezien een punt . elk teken betekent in GREP en je hier letterlijk het teken punt wilt opgeven zet je er het teken voor.)

Een suggestie hoe bovenstaande hyperlink/webadres nog korter kan? Laat weten in de reacties!


TIP: Kopieer ze vanuit deze blog en plak ze in het Zoeken naar GREP venster in InDesign en bewaar ze vervolgens in InDesign als een preset!

2 opmerkingen:

Christa Floor zei

Hoi Frans,

Dank je voor de vermelding van de juiste strings, ik had er naar aanleiding van je boek zelf wel 2 gemaakt: ([^s]*)@([^s]*) en www.([^s]*), maar die waren toch een beetje manky ;)

groetjes, Christa

Anoniem zei

misschien een mooie uitdaging...in de stijl waarin ik bezig ben verdwijnt het www-gedeeelte uit de url......watvoor grep zou ik moeten toepassen in dit geval?