PHP
Strängperspektion
Sök…
Anmärkningar
Regex bör användas för andra användningsområden förutom att få strängar ur strängar eller på annat sätt skär strängar i bitar.
Dela upp en sträng med separatorer
explode
och strstr
är enklare metoder för att få underlag av separatorer.
En sträng som innehåller flera textdelar som är separerade av ett gemensamt tecken kan delas upp i delar med explode
.
$fruits = "apple,pear,grapefruit,cherry";
print_r(explode(",",$fruits)); // ['apple', 'pear', 'grapefruit', 'cherry']
Metoden stöder också en gränsparameter som kan användas enligt följande:
$fruits= 'apple,pear,grapefruit,cherry';
Om gränsparametern är noll, behandlas detta som 1.
print_r(explode(',',$fruits,0)); // ['apple,pear,grapefruit,cherry']
Om gränsen är inställd och positiv, kommer den returnerade matrisen att innehålla maximalt gränselement med det sista elementet som innehåller resten av strängen.
print_r(explode(',',$fruits,2)); // ['apple', 'pear,grapefruit,cherry']
Om gränsparametern är negativ, returneras alla komponenter utom den sista-begränsningen.
print_r(explode(',',$fruits,-1)); // ['apple', 'pear', 'grapefruit']
explode
kan kombineras med list
att analysera en sträng i variabler på en rad:
$email = "[email protected]";
list($name, $domain) = explode("@", $email);
Se dock till att resultatet av explode
innehåller tillräckligt med element, eller att en odefinierad indexvarning skulle utlösas.
strstr
remsor bort eller returnerar endast substringsträngen före den första förekomsten av den givna nålen.
$string = "1:23:456";
echo json_encode(explode(":", $string)); // ["1","23","456"]
var_dump(strstr($string, ":")); // string(7) ":23:456"
var_dump(strstr($string, ":", true)); // string(1) "1"
Söker en substring med strpos
strpos
kan förstås som antalet byte i höstacken innan nålens första förekomst.
var_dump(strpos("haystack", "hay")); // int(0)
var_dump(strpos("haystack", "stack")); // int(3)
var_dump(strpos("haystack", "stackoverflow"); // bool(false)
Kontrollera om det finns en substring
Var försiktig med att kontrollera mot SANT eller FALSE, för om ett index på 0 returneras kommer ett if-uttalande att se detta som FALSE.
$pos = strpos("abcd", "a"); // $pos = 0;
$pos2 = strpos("abcd", "e"); // $pos2 = FALSE;
// Bad example of checking if a needle is found.
if($pos) { // 0 does not match with TRUE.
echo "1. I found your string\n";
}
else {
echo "1. I did not found your string\n";
}
// Working example of checking if needle is found.
if($pos !== FALSE) {
echo "2. I found your string\n";
}
else {
echo "2. I did not found your string\n";
}
// Checking if a needle is not found
if($pos2 === FALSE) {
echo "3. I did not found your string\n";
}
else {
echo "3. I found your string\n";
}
Utförandet av hela exemplet:
1. I did not found your string
2. I found your string
3. I did not found your string
Sök från en offset
// With offset we can search ignoring anything before the offset
$needle = "Hello";
$haystack = "Hello world! Hello World";
$pos = strpos($haystack, $needle, 1); // $pos = 13, not 0
Få alla förekomster av en substring
$haystack = "a baby, a cat, a donkey, a fish";
$needle = "a ";
$offsets = [];
// start searching from the beginning of the string
for($offset = 0;
// If our offset is beyond the range of the
// string, don't search anymore.
// If this condition is not set, a warning will
// be triggered if $haystack ends with $needle
// and $needle is only one byte long.
$offset < strlen($haystack); ){
$pos = strpos($haystack, $needle, $offset);
// we don't have anymore substrings
if($pos === false) break;
$offsets[] = $pos;
// You may want to add strlen($needle) instead,
// depending on whether you want to count "aaa"
// as 1 or 2 "aa"s.
$offset = $pos + 1;
}
echo json_encode($offsets); // [0,8,15,25]
Analysera strängen med vanliga uttryck
preg_match kan användas för att analysera strängen med vanligt uttryck. De delar av uttrycket som är inneslutna inom parentes kallas undermönster och med dem kan du välja enskilda delar av strängen.
$str = "<a href=\"http://example.org\">My Link</a>";
$pattern = "/<a href=\"(.*)\">(.*)<\/a>/";
$result = preg_match($pattern, $str, $matches);
if($result === 1) {
// The string matches the expression
print_r($matches);
} else if($result === 0) {
// No match
} else {
// Error occured
}
Produktion
Array
(
[0] => <a href="http://example.org">My Link</a>
[1] => http://example.org
[2] => My Link
)
träng
Substring returnerar den del av strängen som anges av start- och längdparametrarna.
var_dump(substr("Boo", 1)); // string(2) "oo"
Om det finns en möjlighet att möta strängar med flera byte, skulle det vara säkrare att använda mb_substr.
$cake = "cakeæøå";
var_dump(substr($cake, 0, 5)); // string(5) "cake�"
var_dump(mb_substr($cake, 0, 5, 'UTF-8')); // string(6) "cakeæ"
En annan variant är funktionen substr_replace som ersätter text i en del av en sträng.
var_dump(substr_replace("Boo", "0", 1, 1)); // string(3) "B0o"
var_dump(substr_Replace("Boo", "ts", strlen("Boo"))); // string(5) "Boots"
Låt oss säga att du vill hitta ett specifikt ord i en sträng - och inte vill använda Regex.
$hi = "Hello World!";
$bye = "Goodbye cruel World!";
var_dump(strpos($hi, " ")); // int(5)
var_dump(strpos($bye, " ")); // int(7)
var_dump(substr($hi, 0, strpos($hi, " "))); // string(5) "Hello"
var_dump(substr($bye, -1 * (strlen($bye) - strpos($bye, " ")))); // string(13) " cruel World!"
// If the casing in the text is not important, then using strtolower helps to compare strings
var_dump(substr($hi, 0, strpos($hi, " ")) == 'hello'); // bool(false)
var_dump(strtolower(substr($hi, 0, strpos($hi, " "))) == 'hello'); // bool(true)
Ett annat alternativ är en mycket grundläggande analys av ett e-postmeddelande.
$email = "[email protected]";
$wrong = "foobar.co.uk";
$notld = "foo@bar";
$at = strpos($email, "@"); // int(4)
$wat = strpos($wrong, "@"); // bool(false)
$nat = strpos($notld , "@"); // int(3)
$domain = substr($email, $at + 1); // string(11) "example.com"
$womain = substr($wrong, $wat + 1); // string(11) "oobar.co.uk"
$nomain = substr($notld, $nat + 1); // string(3) "bar"
$dot = strpos($domain, "."); // int(7)
$wot = strpos($womain, "."); // int(5)
$not = strpos($nomain, "."); // bool(false)
$tld = substr($domain, $dot + 1); // string(3) "com"
$wld = substr($womain, $wot + 1); // string(5) "co.uk"
$nld = substr($nomain , $not + 1); // string(2) "ar"
// string(25) "[email protected] is valid"
if ($at && $dot) var_dump("$email is valid");
else var_dump("$email is invalid");
// string(21) "foobar.com is invalid"
if ($wat && $wot) var_dump("$wrong is valid");
else var_dump("$wrong is invalid");
// string(18) "foo@bar is invalid"
if ($nat && $not) var_dump("$notld is valid");
else var_dump("$notld is invalid");
// string(27) "foobar.co.uk is an UK email"
if ($tld == "co.uk") var_dump("$email is a UK address");
if ($wld == "co.uk") var_dump("$wrong is a UK address");
if ($nld == "co.uk") var_dump("$notld is a UK address");
Eller till och med sätta "Fortsätt läsa" eller "..." i slutet av en oskärpa
$blurb = "Lorem ipsum dolor sit amet";
$limit = 20;
var_dump(substr($blurb, 0, $limit - 3) . '...'); // string(20) "Lorem ipsum dolor..."