Kapitel 13. Mer om strängar

Innehållsförteckning
Vad är en sträng
Escape-tecken
Lägga ihop strängar
Jämföra strängar
Ändra strängar
Hantera oönskad HTML i strängar
Söka i strängar
Mer läsning

Strängar är en typ som består av följder av tecken. Till exempel så är "Jag heter Marcus" en sträng. I detta avsnitt tittar vi lite mer på vad man kan göra med strängar.

Vad är en sträng

En sträng är en grupp av tecken. Strängar förekommer, i stort sett, i alla program. PHP är ett språk som är väldigt rikt på funktioner för att hantera strängar. Mycket beroende på att det är ett språk för web-programmering där i princip allt som kommer från programmet är strängar. Det uppmuntrar även till att man låter okända användare mata in strängar till programmen vilket gör att man av säkerhetsskäl måste vara försiktig med strängarna.

I PHP markeras en sträng av att den innesluts av enkla eller dubbla citationstecken. Skillnaden är den att inom dubbla citationstecken kommer alla variabler i strängen att bytas ut mot sitt värde. Se följande exempel:

Exempel 13-1. Exempel med strängar


<?php
$summa = 1 + 6;
echo "Summan är $summa"; // Skriver ut: Summan är 7
echo 'Summan är $summa'; // Skriver ut: Summan är $summa
?>

				
Som du ser så sker ingen variabelsubstitution i den andra raden eftersom den omges av enkla citationstecken.

Escape-tecken

Som vi såg i förra stycket så omges en sträng av citationstecken. En naturlig fråga man då ställer sig är vad som händer om jag vill ha citationstecken i en sträng. Se följande exempel:

Exempel 13-2. Citationstecken i strängar


<?php
echo "Tjenare din gamle "hacker"";
?>

				
Man ser direkt att det inte kommer att bli bra. Hur skall tolkaren kunna veta var strängen slutar? Det som kommer att ske är att strängen börjar vid det första citationstecknet och slutar vid den andra. Den bosktav (h) som kommer efter kommer att orsaka ett "parse error". Hur gör man då? Jo om man vill infoga specialtecken i en sträng måste dessa föregås av specialtecknet \ (bakvänt snedstreck eller backslash). Strängen ovan blir då:

Exempel 13-3. Exempel på escape-tecken


<?php
echo "Tjenare din gamle \"hacker\"";
?>

				
Nu blir utskrifter som vi tänkt oss. Det finns även andra specialtecken:

Tabell 13-1. Specialtecken i strängar

TeckenkombinationSkrivs ut som
\""
\''
\\\
\$$
\nNy rad
\tTab
I strängar inom enkla citationstecken (') så substitueras bara "\'". Alla andra representerar sig själva.

Lägga ihop strängar

Man kan inte lägga ihop strängar med hjälp av additionsoperatorn (+). Den är ju till för aritmetiska termer. Som tur är så finns det speciella opteratorer för just strängar. Den som lägger ihop två strängar kallas för concatenationsoperatorn. Den representeras av tecknet "." (punkt). Se nedanstående exempel.

Exempel 13-4. Exempel med strängar


<?php
$a = "Hello ";
$b = $a . "World!"; // Vi lägger till strängen "World!" efter $a
echo $b; // Skriver ut "Hello World!"
?>

				

Jämföra strängar

I PHP kan man jämföra strängar med de operaorer som vi lärt oss för numeriska värden. Det är ganska specifikt för PHP. Räkna inte med att du kan göra så i andra språk du kommer i kontakt med. Även i PHP finns det funktioner för att jämföra strängar.

Strcmp och strcasecmp

Strcmp (STRing CoMPare) är en funktion som jämför två strängar med varandra. Om de är exakt likadana returneras värdet 0. Om den första är större returneras 1 och om den andra är större returneras -1. Syntaxen och ett exempel på hur den kan användas visas i nedanstående exempel.

Exempel 13-5. Exempel med strcmp


<?php
if (strcmp($password, "Hemligt") == 0) {
   echo "Rätt lösenord";
} else {
   echo "Fel lösenord!";
}
?>

					
Tänk på att strcmp gör skillnad på stora och små bokstävar. Texten "Rätt lösenord" ovan kommer bara att skrivas ut om $password innehåller exakt "Hemligt". Vill du jämföra strängen utan att versaler/gemener skall ha någon betydelse kan du prova strcasecmp som fungerar på samma sätt fast "case insensitive".

Ändra strängar

Ofta vill man ändra på strängar så att de ser lite annorlunda ut. Det kan vara att man vill göra om alla bokstäver till versaler eller gemener. Eller att man vill byta något ord mot ett annat. PHP har massor av funktioner för detta. Vanliga saker man vill göra med strängar är att byta ut en förekomst av ett ord mot ett annat eller att göra alla tecken till små eller stora bokstäver eller ta bort tomma tecken.

strtoupper och strtolower

Dessa två funktioner (STRing TO UPPERcase och LOWERcase) tar en sträng som argument och returnerar samma sträng med alla bokstäver konverterade till antingen stora bokstäver (versaler) eller små bokstäver (gemener).

Se följande lilla exempel:

Exempel 13-6. Exempel med strtoupper och strtolower


<?php
$str1 = "Kalle Anka";
$str2 = strtolower($str1);  // str2 blir "kalle anka"
$str3 = strtoupper($str1);  // str3 blir "KALLE ANKA"
echo "\$str1: ". $str1;
echo "\n\$str2: ". $str2;
echo "\n\$str3: ". $str3 ."\n";
?>

					

Ucfirst och ucwords

Dessa två funtioner (UpperCase FIRST och WORDS) är kanske inte lika användbara som strtoupper och strtolower men kan vara bra att känna till. De kan användas till exempel om man vill snygga till användarinmatad data. Vad de gör är att göra den första bokstaven i en sträng (ucfirst) eller första bokstaven i varje ord i strängen (ucwords) till versal. Observera att dessa funktioner bara verkar på de tecken det gäller och inte de övriga. Se följande exempel:

Exempel 13-7. Exempel med ucfirst och ucword


<?php
$str1 = "kalle anka";
$str2 = ucwords($str1); // str2 blir "Kalle Anka"

$str1 = 'KALLE ANKA';
$str2 = ucwords($str1); // str2 blir KALLE ANKA (inga tecken blir gemener)

$str3 = ucwords(strtolower($str1)); // str3 blir Kalle Anka
?>

					
I exemplet ser vi att "KALLE ANKA" blir samma sak efter ucwords. Det beror på att denna funktion bara verkar på det första tecknet i varje ord. Detta görs versalt. Inget annat görs. Är alla tecken versaler så kommer inget att ske. I den sista satsen lägger vi in ett anrop till strtolower vilket gör att ucwords matas med strängen "kalle anka" istället.

Ucfirst fungerar på exakt samma sätt fast bara på det allra första tecknet i strängen.

strrev

Detta är en väldigt trevlig lite funktion (STRing REVerse). Det enda den gör är att den tar en sträng som argument och returnerar samma sträng fast reverserad.

Exempel 13-8. Exempel med strrev


<?php
$str1 = "Kalle Anka";
$str2 = strrev($str1); // str2 blir "aknA ellaK"
?>

					

strlen

En betydligt mer användbar funktion än strrev är strlen (STRing LENgth). Denna returnerar antalet tecken i en sträng.

Som vanligt tar vi ett litet exempel:

Exempel 13-9. Exemepel med strrev


<?php
$str1 = "Kalle Anka";
echo strlen($str1);          // skriver ut 10
echo strlen(" Kalle Anka "); // skriver ut 12
?>

					

str_replace

Detta är en mycket användbar funktion. Den byter ut en teckenföljd i en mening mot en annan. Funktionen tar tre argument och returnerar en sträng. Det första argumentet är den teckenföljd som skall ersättas, det andra är det som det skall ersättas med och det tredje argumentet är den sträng som det hela berör. Det som returneras är strängen i det tredje argumentet där alla förekomster av teckenföljden i det första argumentet ersatts med tecknen i det andra argumentet.

Förvirrad? Se nedanstående exempel:

Exempel 13-10. Exempel med str_replace


<?php
$str1 = "Kalle Anka är bäst";
$str2 = str_replace("Kalle", "Kajsa", $str1);

echo $str2;  // str2 är "Kajsa Anka är bäst"
?>

					
Detta är användbart till väldigt mycket. Bara fantasin sätter gränserna.

Hantera oönskad HTML i strängar

I PHP hanterar man av naturliga skäl ofta strängar som skall presenteras i en webläsare. Flera av dessa strängar kommer vanligtvis från användare eller andra osäkra källor. Då vill man gärna kontrollera så att inte användaren kan mata in data som förstör resten av sidan. Till exempel så skall man inte i ett web-forum kunna skriva in HTML-kod hur som helst. Man skulle då kunna länka in fula bilder eller andra typsnittet på hela sidan. Man kan åstadkomma detta genom att använda massor av anrop på str_replace. Till exempel:

Exempel 13-11. Med str_replace


<?php
//
// Följande två rader tar bort alla förekomster av större än och
// mindre än och ersätter dem med deras HTML-motsvarighet. Detta
// eliminerar alla HTML-taggar.
//
$html_string = str_replace("&lt;", "&amp;lt;", $html_string);
$html_string = str_replace("&gt;", "&amp;gt;", $html_string);
?>

				
Men det finns bättre sätt att göra det på. Det finns (naturligtvis) färdiga funktioner som gör HTML av strängar, till exempel htmlentities. htmlentities gör om en sträng så att alla tecken som har en motsvarighet i HTML kod blir just, HTML kod. Funktionen tar ett argument och har två stycken valfria argument som du inte behöver ange, mer än om du t.ex. behöver använda en annan teckenuppsättning. Se följande exempel:

Exempel 13-12. Exempel med htmlentities


<?php
$str1 = "<h1>Kalle Anka</h1>"; // Blir "Kalle Anka" (Rubrik 1) i browsern
$str2 = htmlentities($str1);   // Blir <h1>Kalle Anka</h1>; i browsern
?>

				
Detta gör att allt man skickar till htmlentities kommer att synas i browsern precis som det ser ut i klartext.

Söka i strängar

Ofta vill man hitta eller använda bara vissa delar av en sträng. Det finns flera funktioner för detta. Vi skall titta på två av dem.

strstr och stristr

Dessa två funktioner fungerar så att de tar två argument, båda är strängar (STRing in STRing och STRing case-Insensitive in STRing). Den första är den sträng som det skall sökas i och det andra är det sökta. Det som returneras är det som är kvar av det första argumentet efter den funna strängen. Förvirrad?

Exempel 13-13. Exemempel med strstr()


<?php
$namn = "Kalle Anka";
$enamn = strstr($namn, " ");    // enamn blir " Anka"

$adress = "kalle@ankeborg.net";
$domain = strstr($adress, "@"); // domain blir "@ankeborg.net"
?>

					
Funktionen stristr fungerar på samma sätt men den bryr sig inte om om den eftersökta strängen har stora eller små bokstäver (Case-Insensitive).

Mer läsning

Aktuellt avsnitt i Manualen. http://www.php.net/manual/en/ref.strings.php