PHP
String parseren
Zoeken…
Opmerkingen
Regex moet worden gebruikt voor andere doeleinden dan het verwijderen van snaren uit snaren of het op andere wijze in stukken snijden van snaren.
Een string splitsen door scheidingstekens
explode
en strstr
eenvoudiger methoden om substrings krijgen door het scheiders.
Een tekenreeks die verschillende delen van tekst bevat die worden gescheiden door een gemeenschappelijk teken, kan worden gesplitst in delen met de explode
functie.
$fruits = "apple,pear,grapefruit,cherry";
print_r(explode(",",$fruits)); // ['apple', 'pear', 'grapefruit', 'cherry']
De methode ondersteunt ook een limietparameter die als volgt kan worden gebruikt:
$fruits= 'apple,pear,grapefruit,cherry';
Als de limietparameter nul is, wordt deze behandeld als 1.
print_r(explode(',',$fruits,0)); // ['apple,pear,grapefruit,cherry']
Als limiet is ingesteld en positief, bevat de geretourneerde array maximaal limietelementen, waarbij het laatste element de rest van de reeks bevat.
print_r(explode(',',$fruits,2)); // ['apple', 'pear,grapefruit,cherry']
Als de limietparameter negatief is, worden alle componenten behalve de laatste -limiet geretourneerd.
print_r(explode(',',$fruits,-1)); // ['apple', 'pear', 'grapefruit']
explode
kan worden gecombineerd met list
om een string in variabelen op één regel te ontleden:
$email = "[email protected]";
list($name, $domain) = explode("@", $email);
Zorg er echter voor dat het resultaat van explode
voldoende elementen bevat, anders wordt een ongedefinieerde indexwaarschuwing geactiveerd.
strstr
strips of retourneert alleen de substring vóór het eerste optreden van de gegeven naald.
$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"
Een substring zoeken met strpos
strpos
kan worden begrepen als het aantal bytes in de hooiberg vóór het eerste optreden van de naald.
var_dump(strpos("haystack", "hay")); // int(0)
var_dump(strpos("haystack", "stack")); // int(3)
var_dump(strpos("haystack", "stackoverflow"); // bool(false)
Controleren of er een substring bestaat
Wees voorzichtig met het controleren op WAAR of ONWAAR, omdat als een index van 0 wordt geretourneerd een if-instructie dit als ONWAAR zal zien.
$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";
}
Output van het hele voorbeeld:
1. I did not found your string
2. I found your string
3. I did not found your string
Zoeken vanaf een 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
Krijg alle exemplaren van een 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]
Tekenreeks parseren met reguliere expressies
preg_match kan worden gebruikt om tekenreeksen te parseren met reguliere expressie. De delen van expressie tussen haakjes worden subpatronen genoemd en hiermee kunt u afzonderlijke delen van de string kiezen.
$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
}
uitgang
Array
(
[0] => <a href="http://example.org">My Link</a>
[1] => http://example.org
[2] => My Link
)
subtekenreeks
Substring retourneert het gedeelte van de string dat is opgegeven door de parameters start en length.
var_dump(substr("Boo", 1)); // string(2) "oo"
Als het mogelijk is om multi-byte tekenreeksen te ontmoeten, dan is het veiliger om mb_substr te gebruiken.
$cake = "cakeæøå";
var_dump(substr($cake, 0, 5)); // string(5) "cake�"
var_dump(mb_substr($cake, 0, 5, 'UTF-8')); // string(6) "cakeæ"
Een andere variant is de functie substr_replace, die tekst binnen een gedeelte van een string vervangt.
var_dump(substr_replace("Boo", "0", 1, 1)); // string(3) "B0o"
var_dump(substr_Replace("Boo", "ts", strlen("Boo"))); // string(5) "Boots"
Stel dat u een specifiek woord in een string wilt vinden - en geen Regex wilt gebruiken.
$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)
Een andere optie is een zeer eenvoudige analyse van een 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");
Of zelfs de "Verder lezen" of "..." plaatsen aan het einde van een fout
$blurb = "Lorem ipsum dolor sit amet";
$limit = 20;
var_dump(substr($blurb, 0, $limit - 3) . '...'); // string(20) "Lorem ipsum dolor..."