PHP
String-Analyse
Suche…
Bemerkungen
Regex sollte für andere Zwecke verwendet werden, außer dass Sie Saiten aus Saiten bekommen oder anderweitig in Stücke schneiden.
String durch Trennzeichen aufteilen
explode
und strstr
sind einfachere Methoden, um Teilstrings durch Trennzeichen strstr
.
Eine Zeichenfolge, die mehrere Textteile enthält, die durch ein gemeinsames Zeichen getrennt sind, kann mit der explode
in Teile aufgeteilt werden.
$fruits = "apple,pear,grapefruit,cherry";
print_r(explode(",",$fruits)); // ['apple', 'pear', 'grapefruit', 'cherry']
Die Methode unterstützt auch einen Grenzparameter, der wie folgt verwendet werden kann:
$fruits= 'apple,pear,grapefruit,cherry';
Wenn der Grenzwert Null ist, wird dies als 1 behandelt.
print_r(explode(',',$fruits,0)); // ['apple,pear,grapefruit,cherry']
Wenn limit gesetzt und positiv ist, enthält das zurückgegebene Array ein Maximum an limit-Elementen, wobei das letzte Element den Rest der Zeichenfolge enthält.
print_r(explode(',',$fruits,2)); // ['apple', 'pear,grapefruit,cherry']
Wenn der Grenzparameter negativ ist, werden alle Komponenten mit Ausnahme des letzten Grenzwerts zurückgegeben.
print_r(explode(',',$fruits,-1)); // ['apple', 'pear', 'grapefruit']
explode
kann mit list
kombiniert werden, um einen String in Variablen in einer Zeile zu parsen:
$email = "[email protected]";
list($name, $domain) = explode("@", $email);
Stellen Sie jedoch sicher, dass das Ergebnis von explode
genügend Elemente enthält oder dass eine undefinierte Indexwarnung ausgelöst wird.
strstr
streift ab oder gibt den Teilstring vor dem ersten Auftreten der angegebenen Nadel zurück.
$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"
Suchen eines Teilstrings mit strpos
strpos
kann die Anzahl der Bytes im Heuhaufen vor dem ersten Auftreten der Nadel verstanden werden.
var_dump(strpos("haystack", "hay")); // int(0)
var_dump(strpos("haystack", "stack")); // int(3)
var_dump(strpos("haystack", "stackoverflow"); // bool(false)
Überprüfen, ob eine Teilzeichenfolge vorhanden ist
Seien Sie vorsichtig bei der Prüfung nach TRUE oder FALSE, da eine if-Anweisung dies als FALSE sieht, wenn ein Index von 0 zurückgegeben wird.
$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";
}
Ausgabe des ganzen Beispiels:
1. I did not found your string
2. I found your string
3. I did not found your string
Suche ausgehend von einem 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
Liefert alle Vorkommen eines Teilstrings
$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]
Zeichenfolge mit regulären Ausdrücken analysieren
preg_match kann verwendet werden, um einen String mit regulären Ausdrücken zu analysieren. Die in Klammern eingeschlossenen Teile des Ausdrucks werden als Untermuster bezeichnet, mit denen Sie einzelne Teile der Zeichenfolge auswählen können.
$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
}
Ausgabe
Array
(
[0] => <a href="http://example.org">My Link</a>
[1] => http://example.org
[2] => My Link
)
Unterstring
Substring gibt den Teil der Zeichenfolge zurück, der durch die Start- und Längenparameter angegeben wird.
var_dump(substr("Boo", 1)); // string(2) "oo"
Wenn die Möglichkeit besteht, Zeichenfolgen mit mehreren Bytes zu treffen, ist die Verwendung von mb_substr sicherer.
$cake = "cakeæøå";
var_dump(substr($cake, 0, 5)); // string(5) "cake�"
var_dump(mb_substr($cake, 0, 5, 'UTF-8')); // string(6) "cakeæ"
Eine andere Variante ist die Funktion substr_replace, die Text in einem Teil einer Zeichenfolge ersetzt.
var_dump(substr_replace("Boo", "0", 1, 1)); // string(3) "B0o"
var_dump(substr_Replace("Boo", "ts", strlen("Boo"))); // string(5) "Boots"
Angenommen, Sie möchten ein bestimmtes Wort in einer Zeichenfolge finden - und Regex nicht verwenden.
$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)
Eine weitere Option ist das sehr einfache Parsen einer E-Mail.
$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");
Oder Sie setzen sogar "Continue reading" oder "..." am Ende eines Klappers
$blurb = "Lorem ipsum dolor sit amet";
$limit = 20;
var_dump(substr($blurb, 0, $limit - 3) . '...'); // string(20) "Lorem ipsum dolor..."