<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Mikael Brevik &#187; regexp</title>
	<atom:link href="http://mikaelb.net/emneord/regexp/feed/" rel="self" type="application/rss+xml" />
	<link>http://mikaelb.net</link>
	<description>Bloggen</description>
	<lastBuildDate>Mon, 07 Sep 2009 20:11:35 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Hvordan lage regulære uttrykk</title>
		<link>http://mikaelb.net/2008/12/hvordan-lage-regulaere-uttrykk/</link>
		<comments>http://mikaelb.net/2008/12/hvordan-lage-regulaere-uttrykk/#comments</comments>
		<pubDate>Thu, 04 Dec 2008 17:01:57 +0000</pubDate>
		<dc:creator>Mikael Brevik</dc:creator>
				<category><![CDATA[Generelt]]></category>
		<category><![CDATA[regexp]]></category>
		<category><![CDATA[regular expression]]></category>
		<category><![CDATA[regulære uttrykk]]></category>

		<guid isPermaLink="false">http://mikaelb.net/blogg/?p=17</guid>
		<description><![CDATA[Syntaksen i regulære uttrykk kan deles opp i flere grupper. I alt har vi 5 forskjellige. Disse kan vi si er

Tegnsetting
Ankrer
Klassekoder
Klasser
Modifiers

Disse gruppene dekker ikke alle felt, men de fleste. F.eks dekker de ikke hexadecimal som koden er \xTALL på.
Tegnsetting
Tegnsettingen er veldig essensielt i RegExp. De kan bestemme alt som skal foregå i et uttrykk.

\ » [...]]]></description>
			<content:encoded><![CDATA[<p>Syntaksen i regulære uttrykk kan deles opp i flere grupper. I alt har vi 5 forskjellige. Disse kan vi si er</p>
<ul>
<li>Tegnsetting</li>
<li>Ankrer</li>
<li>Klassekoder</li>
<li>Klasser</li>
<li>Modifiers</li>
</ul>
<p>Disse gruppene dekker ikke alle felt, men de fleste. F.eks dekker de ikke hexadecimal som koden er <code>\xTALL</code> på.</p>
<h3>Tegnsetting</h3>
<p>Tegnsettingen er veldig essensielt i RegExp. De kan bestemme alt som skal foregå i et uttrykk.</p>
<ul>
<li><code>\</code> » Den escaper andre tegn og klasser. Brukes forrann et annet tegn og du matcher tegnet. Bruker du den forrann klasser så blir det en annen sak, som vi kommer tilbake til. <span>Eksempel: <code>/(http:\/\/)/</code></span></li>
<li><code>|</code> » Kan oversettes til <em>eller</em>. <span>Eksempel: <code>/(http|ftp):\/\//</code></span></li>
<li><code>{ og }</code> » Setter lengden den skal godta. <span>Eksempel: <code>/([\w]{10,20})/</code></span></li>
<li><code>( og )</code> » Grupperer valgene og velger det en kan bruke senere. F.eks det som er mellom paranteser kan bli kalt med \\1 i en preg_replace. <span>Eksempel: <code>/([\w]{10,20})/</code></span></li>
<li><code>[ og ]</code> » Setter klasser av tegn og rekkevidder. <span>Eksempel: <code>/[a-z]/</code></span></li>
<li><code>.</code> » Alle tegn foruten <code>\n</code> <span>Eksempel: <code>/./</code></span></li>
<li><code>*</code> » Matcher tegn fra 0 eller mer. Samme som {0,}  <span>Eksempel: <code>/(.*)/</code></span></li>
<li><code>+</code> » Matcher tegn fra 1 eller mer. Samme som {1,}  <span>Eksempel: <code>/(.+)/</code></span></li>
<li><code>?</code> » Matcher tegn fra 1 eller ingen. Samme som {0,1}  <span>Eksempel: <code>/(.?)/</code></span></li>
<li><code>^</code> » Definerer starten på en streng.<span>Eksempel: <code>/^[a-z]{3,6}/</code> &#8211; Inneholder a-z på de 3-6 første tegnene av en streng</span></li>
<li><code>$</code> » Definerer slutten på en streng. <span>Eksempel: <code>/[a-z]{3,6}$/</code> &#8211; Inneholder a-z på de 3-6 siste tegnene av en streng</span></li>
</ul>
<h3>Ankrer</h3>
<p>Ankerkoder vil definere hvor i strengen du mener. ^ og $ er to ankerkoder. Men det finnes flere.</p>
<ul>
<li><code>\b</code> » Setter en grense i et ord. Kutter ordet etter match.<span>Eksempel: <code>/MinStreng\b/</code></span></li>
<li><code>\B</code> » Tar alt utenom grensen<span>Eksempel: <code>/Rat\B/</code> &#8211; Tar Rattata, men ikke kun Rat.</span></li>
<li><code>\A</code> » Definerer starten på en streng.</li>
<li><code>\Z</code> » Definerer starten på en streng.</li>
</ul>
<h3>Klassekoder og klasser</h3>
<p>Her er det som definerer rangen mellom strenger. Hvilke tegn den skal matche o.l. Det er flere måter å gjøre det på, bruke enkeltbokstaver med escape, f.eks \w og \d. Eller bruke range &#8220;manuelt&#8221;, f.eks [a-z] og [0-9].</p>
<ul>
<li><code>\d</code> == <code>[0-9]</code> » Matcher alle tall</li>
<li><code>\D</code> == <code>[^0-9]</code> » Matcher alle ikke tall</li>
<li><code>\w</code> == <code>[a-zA-Z_0-9]</code> » Matcher alle bokstaver fra a til z, store og små. Samt tall og understrek.</li>
<li><code>\W</code> == <code>[^a-zA-Z_0-9]</code> » Matcher alt som ikke er a-z (små og stort), tall og understrek</li>
<li><code>\s</code> == <code>[ \t\n\r\f]</code> » Matcher whitespace, tabulater, newline osv.</li>
<li><code>\S</code> == <code>[^ \t\n\r\f]</code> » Matcher alt som ikke er whitespace, tabulater, newline osv.</li>
</ul>
<h3>Modifiers</h3>
<p>Jeg mangler et norsk ord på dette. Alle har hørt om det, men er ikke sikkert de er klar over alle eller vet hva de gjør. De fleste vet hva i-modifieren gjør, men har du hørt om o? Eller g? Eller kanskje e? Vel, her er en liste over modifiers.</p>
<ul>
<li><code>i</code> » Gjør mønsteret case-insensitive</li>
<li><code>e</code> » Bruk som callback i preg_replace i PHP.</li>
<li><code>x</code> » Bruk utvidet regulært uttrykk</li>
<li><code>o</code> » Kjør uttrykket kun èn gang.</li>
<li><code>g</code> » Kjør uttrykket globalt. Over flere ganger. Som preg_match_all()</li>
<li><code>m</code> » Behandle uttrykket som flere linjer</li>
<li><code>s</code> » Behandle uttrykket som kun èn linjer</li>
</ul>
<h3>Hvordan sette det sammen?</h3>
<p>Så nå har vi all informasjonen vi trenger til å sette sammen et uttrykk. Slik som dette:</p>
<h4>Eksempel</h4>
<p>Vi skal stoppe spam, og har sett at et fellestrekk med spam-postene er at postene ofte har &#8220;Hey&#8221;, &#8220;Hello&#8221; eller &#8220;Hi&#8221; i starten, og fulgt av to linker på neste linje. Den inneholder også tekst etter &#8220;Hey&#8221;, &#8220;Hello&#8221; eller &#8220;Hi&#8221;. Denne er observert som vanlig tekst mellom 14 og 25 tegn.</p>
<p>Eksempel på kommentar ser slik ut:</p>
<blockquote><p>
Hello! Great site, pal!<br />
&lt;a href=&#8221;http://mikaelb.net/#&#8221;&gt;SpamLink&lt;/a&gt; | &lt;a href=&#8221;http://mikaelb.net/#&#8221;&gt;SpamLink&lt;/a&gt;
</p></blockquote>
<p>Vi skal lage et uttrykk som passer dette, hvordan?</p>
<p>Tenk et ledd om gangen. Først starter vi med at alle starter med &#8220;H&#8221;. Da gjør vi slik:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #339933;">/</span>^H<span style="color: #339933;">/</span>i</pre></td></tr></table></div>

<p>Men siden det er et ord der, kan vi videreutvikle den og skrive slik:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #339933;">/</span>^H<span style="color: #009900;">&#91;</span>^\s<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#123;</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">6</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">/</span>i</pre></td></tr></table></div>

<p>Så hva har du mer av i strengen etter Hello/Hei/Hi? Jo, det kommer mellomrom og mer påfølgende tekst. Teksten kan være alle tegn utenom newline. Det kan skrives slik <code>[^\n]</code>. Og den teksten var mellom 14 og 25 tegn. Da utvider vi den og lar den bli slik:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #339933;">/</span>^H<span style="color: #009900;">&#91;</span>^\s<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#123;</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">6</span><span style="color: #009900;">&#125;</span>\s?<span style="color: #009900;">&#91;</span>^\n<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#123;</span><span style="color: #cc66cc;">14</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">25</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">/</span>i</pre></td></tr></table></div>

<p>Grunnen til at jeg har \s? er for det skal være space, men eventuelt ikke. Derav er det ? etter \s, for å få valgfriheten.</p>
<p>Så kan vi tenke oss at et uttrykk for en link ser slik ut:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;</span>a<span style="color: #009900;">&#91;</span>^<span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span><span style="color: #009900;">&#93;</span>?href<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;[^&amp;gt;]&quot;</span><span style="color: #009900;">&#91;</span>^<span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span><span style="color: #009900;">&#93;</span>?<span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">.*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;</span>\<span style="color: #339933;">/</span>a<span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Så kan vi sette den sammen til ett uttrykk:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #339933;">/</span>^H<span style="color: #009900;">&#91;</span>^\s<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#123;</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">6</span><span style="color: #009900;">&#125;</span>\s?<span style="color: #009900;">&#91;</span>^\n<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#123;</span><span style="color: #cc66cc;">14</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">25</span><span style="color: #009900;">&#125;</span>\s<span style="color: #339933;">*</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;</span>a<span style="color: #009900;">&#91;</span>^<span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span><span style="color: #009900;">&#93;</span>?href<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;[^&amp;gt;]&quot;</span><span style="color: #009900;">&#91;</span>^<span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span><span style="color: #009900;">&#93;</span>?<span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">.*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;</span>\<span style="color: #339933;">/</span>a<span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span><span style="color: #009900;">&#91;</span>^<span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span><span style="color: #009900;">&#93;</span>?<span style="color: #009900;">&#41;</span><span style="color: #339933;">*</span>\z<span style="color: #339933;">/</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://mikaelb.net/2008/12/hvordan-lage-regulaere-uttrykk/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
