några sidor på nätet om PHP programmering

Sök efter  
Börja här Uppgifter Testa dig själv Tips Sidokarta mm. Länkar Sök

Vanliga HTML inriktade Regexp Regexp i PHP Övriga

1.9.4 Regexp i PHP

Det finns egentligen två olika "skolor" för regular expressions:

  1. PHP:s egen variant - representerad av t.ex. ereg
  2. 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.

   Börja härSträngarRegexp i PHP