Vanliga
HTML inriktade
Regexp
Regexp i PHP
Övriga
1.9.4 Regexp i PHP
Det finns egentligen två olika "skolor" för regular
expressions:
- PHP:s egen variant - representerad av t.ex. ereg
- PERL kompatibel regular expression - preg_match mm.
Jag tänker bara ta upp de PERL-kompatibla
funktionerna. Sök i PHP:s dokumentation eller på nätet
om du vill veta mer om ereg mm.
preg_match
Email exempel:
<?php
# en email - hårdkodad för exemlet
$texten = "Fornamn.efternamn@firma.vad.com";
# pattern för e-mail
# preg_* funktionerna i PHP kräver att
# strängen omsluts av / tecken
$pattern = "/^[\w\.]+@\w+\.[\w\.]+$/";
# parametrar:
# string pattern
# string texten
# array matches
if ( preg_match( $pattern, $texten, $matches ) )
{
echo "OK<br>";
foreach( $matches as $index=>$value)
{
echo "\$matches[" . $index ."] = ". $value ."<br>";
}
}
else
{
echo "FEL";
}
# samma som ovan men observera parenteserna
# och vad matches arrayen kommer att innehålla
$pattern = "/^([\w\.]+)@(\w+\.[\w\.]+)$/";
# parametrar:
# string pattern
# string texten
# array matches
if ( preg_match( $pattern, $texten, $matches ) )
{
echo "OK<br>";
foreach( $matches as $index=>$value)
{
echo "\$matches[" . $index ."] = ". $value ."<br>";
}
}
else
{
echo "FEL";
}
?>
Listning 1.9.4.1 - samples/s82.php
OK $matches[0] = Fornamn.efternamn@firma.vad.com OK $matches[0] = Fornamn.efternamn@firma.vad.com $matches[1] = Fornamn.efternamn $matches[2] = firma.vad.com
Resultat av listning 1.9.4.1
Sökning i html kod
<?php
# extrakt ut html fil
# observera de överflödiga mellanslagen och stavningen
# av fOnt
$texten = "text < fOnt face=\"arial\" size=\"2\">Med arial</font> asdasd";
# sök efter < följt av eventuell "whitespace"
# sedan skall det stå font följt av lite vad som helst
# sedan skall det komma >
# följt av vad som helst
# Sedan <, eventuell "whitespace", /, font, eventuell whitespace >
# /i i slutet gör att jämförelsen är "case insensitive", d.v.s
# det är ingen skillnad på font och FONT
# observer att det som kommer i fint taggen har satts
# inom parentes Det som sätts inom parentes kommer att komma som
# en skild post i arrayen
$pattern1 = '/<\s*font.*>(.*)<\s*\/\s*font\s*>/i';
if ( preg_match( $pattern1, $texten, $matches ) )
{
echo "OK<br>";
foreach( $matches as $index=>$value)
{
echo "\$matches[" . $index ."] = ". htmlentities( $value) ."<br>";
}
}
else
{
echo "FEL";
}
?>
Listning 1.9.4.2 - samples/s84.php
OK $matches[0] = < fOnt face="arial" size="2">Med arial</font> $matches[1] = Med arial
Resultat av listning 1.9.4.2
Mer acancerad sökning i html-kod
<?php
$filen = file("./samples/demo.htm");
# kommer som en array - så jag föser ihop den
$filen = implode($filen, "");
echo "./samples/demo.htm och dess innehåll<br><br>";
echo nl2br(htmlentities($filen)) . "<br>";
$titeln = "/<\s*title\s*>([^<]*)<\s*\/s*title\s*>/i";
if ( preg_match( $titeln, $filen, $matches ) )
{
echo "<br>Sidans titel var :<br><b>" . $matches[1] . "</b><br>";
echo "Denna hittades med :<br><b>" . $titeln . "</b><br>";
}
$body = "/<\s*body\s*>\s*([\w\W]*)\s*<\s*\/s*body\s*>/i";
if ( preg_match( $body, $filen, $matches ) )
{
echo "<br>Sidans innehåll var:<br><b>" .
nl2br(htmlentities($matches[1])) . "</b><br>";
echo "Denna hittades med:<br><b>" . $body . "</b><br>";
}
?>
Listning 1.9.4.3 - samples/s85.php
./samples/demo.htm och dess innehåll
<html>
<head>
<title>En titel</title>
</head>
<body>
<p>KALLE</p>
<a href="http://www.bet.puv.fi/">En länk</a><br>
<a href="../default.php">En till länk</a><br>
</body>
</html>
Sidans titel var : En titel Denna hittades med : /<\s*title\s*>([^<]*)<\s*\/s*title\s*>/i
Sidans innehåll var: <p>KALLE</p>
<a href="http://www.bet.puv.fi/">En länk</a><br>
<a href="../default.php">En till länk</a><br>
Denna hittades med: /<\s*body\s*>\s*([\w\W]*)\s*<\s*\/s*body\s*>/i
Resultat av listning 1.9.4.3
preg_match_all
Söker fram alla förekomster. För övrigt som preg_match
<?php
$realFile = "http://" .
$_SERVER["SERVER_NAME"] .
dirname($_SERVER["SCRIPT_NAME"]) .
"/samples/demo.htm";
$filen = file($realFile) Or Die("kunde inte öppna filen");
# kommer som en array - så jag föser ihop den
$filen = implode($filen, "");
echo $realFile . " och dess länkar<br><br>";
$hrefs = '/<a\s*href="(.*)">(.*)<\s*\/s*a\s*>/i';
if ( preg_match_all( $hrefs, $filen, $matches ) )
{
# får en tvådimensionell array
for ($i=0; $i< count($matches[0]); $i++)
{
echo "<br>En länk var : <br><b>" .
htmlentities($matches[0][$i]) . "</b><br>";
echo "Med href : <br><b>" . $matches[1][$i] . "</b><br>";
echo "och förklaring :<br><b>" . $matches[2][$i] . "</b><br>";
}
}
?>
Listning 1.9.4.4 - samples/s86.php
http://enges.org/phpkurs/samples/demo.htm och dess länkar
En länk var : <a href="http://www.bet.puv.fi/">En länk</a> Med href : http://www.bet.puv.fi/ och förklaring : En länk
En länk var : <a href="../default.php">En till länk</a> Med href : ../default.php och förklaring : En till länk
Resultat av listning 1.9.4.4
preg_replace
<?php
# variant 1 - enkelt (?) byte
# ---------------------------------------
$amerikansktDatum = "2/31/2002";
# sök 2 siffror följt av en /, . eller -
# sök 2 siffror igen följt av en /, . eller -
# sök 19 eller 20 följt av två siffror
# sätt varje siffra inom parentes så att
# vi får separata matches
$sök = "/^(\d{1,2})[\/.-](\d{1,2})[\/.-](19|20\d{2})$/";
# sätt in andra siffran, en punkt, första siffran
# en punkt och slutligen sista siffran
$ersätt = "\\2.\\1.\\3";
# utför
$finsktDatum = preg_replace($sök, $ersätt, $amerikansktDatum);
echo "\$amerikansktDatum = $amerikansktDatum <br>";
echo "\$finsktDatum = $finsktDatum <br>";
# prova ett annat datim
$amerikansktDatum = "2.31-2002";
$finsktDatum = preg_replace($sök, $ersätt, $amerikansktDatum);
echo "\$amerikansktDatum = $amerikansktDatum <br>";
echo "\$finsktDatum = $finsktDatum <br>";
# variant 2 - array
# ---------------------------------------
$texten = "kålle och ada är ute och går i skogen";
# en array med regexp sökningar - hela ord (\b)
$enkel = array("/\bkålle\b/", "/\bada\b/", "/\bgår\b/", "/\bskogen\b/");
# en array med lika många ersättande ord
$märkvärdig = array("Charles", "Adelia", "spatserar", "parken");
# erätt alla
echo preg_replace($enkel, $märkvärdig, $texten);
# strippa all extra whitespace
$text = " en massa \t extra \n space";
echo "<pre>";
echo $text . "<br>";
# strippa all extra whitespace - ersätt med enskilda mellanslag
echo preg_replace("/\s+/", " ", $text) . "<br>";
echo "</pre>";
# se PHP dokumentationen för fler exempel
?>
Listning 1.9.4.5 - samples/s87.php
$amerikansktDatum = 2/31/2002 $finsktDatum = 31.2.2002 $amerikansktDatum = 2.31-2002 $finsktDatum = 31.2.2002 Charles och Adelia är ute och spatserar i parken en massa extra
space en massa extra space
Resultat av listning 1.9.4.5
Ett tips i all välmening: Lär er Regexp. Det finns mycket
"muskler" i dessa.
|