PHP
Analyse de chaîne
Recherche…
Remarques
Regex devrait être utilisé pour d'autres utilisations en plus d'obtenir des chaînes de chaînes ou de couper des chaînes autrement.
Fractionner une chaîne par des séparateurs
explode
et strstr
sont des méthodes plus simples pour obtenir par des séparateurs sous - chaînes.
Une chaîne contenant plusieurs parties de texte qui sont séparées par un caractère commun peut être divisé en deux parties avec le explode
fonction.
$fruits = "apple,pear,grapefruit,cherry";
print_r(explode(",",$fruits)); // ['apple', 'pear', 'grapefruit', 'cherry']
La méthode prend également en charge un paramètre de limite qui peut être utilisé comme suit:
$fruits= 'apple,pear,grapefruit,cherry';
Si le paramètre limite est zéro, cela est traité comme 1.
print_r(explode(',',$fruits,0)); // ['apple,pear,grapefruit,cherry']
Si limit est défini et positif, le tableau renvoyé contiendra un maximum d'éléments limit avec le dernier élément contenant le reste de la chaîne.
print_r(explode(',',$fruits,2)); // ['apple', 'pear,grapefruit,cherry']
Si le paramètre limit est négatif, tous les composants, à l'exception de la dernière limite, sont renvoyés.
print_r(explode(',',$fruits,-1)); // ['apple', 'pear', 'grapefruit']
explode
peut être combiné avec list
pour analyser une chaîne en variables sur une seule ligne:
$email = "[email protected]";
list($name, $domain) = explode("@", $email);
Cependant, assurez-vous que le résultat de l' explode
contient suffisamment d'éléments ou qu'un avertissement d'index indéfini serait déclenché.
strstr
se sépare ou ne renvoie que la sous-chaîne avant la première occurrence de l'aiguille donnée.
$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"
Rechercher une sous-chaîne avec strpos
strpos
peut être compris comme le nombre d'octets dans la botte de foin avant la première occurrence de l'aiguille.
var_dump(strpos("haystack", "hay")); // int(0)
var_dump(strpos("haystack", "stack")); // int(3)
var_dump(strpos("haystack", "stackoverflow"); // bool(false)
Vérification de l'existence d'une sous-chaîne
Faites attention à vérifier avec VRAI ou FAUX parce que si un index de 0 est renvoyé, une instruction if verra ceci comme 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";
}
Sortie de l'exemple complet:
1. I did not found your string
2. I found your string
3. I did not found your string
Recherche à partir d'un 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
Récupère toutes les occurrences d'une sous-chaîne
$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]
Analyse de la chaîne à l'aide d'expressions régulières
preg_match peut être utilisé pour analyser la chaîne en utilisant une expression régulière. Les parties de l'expression entre parenthèses sont appelées sous-modèles et avec eux, vous pouvez choisir des parties individuelles de la chaîne.
$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
}
Sortie
Array
(
[0] => <a href="http://example.org">My Link</a>
[1] => http://example.org
[2] => My Link
)
Substring
La sous-chaîne renvoie la partie de la chaîne spécifiée par les paramètres de début et de longueur.
var_dump(substr("Boo", 1)); // string(2) "oo"
S'il y a une possibilité de rencontrer des chaînes de caractères multi-octets, alors il serait plus sûr d'utiliser 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æ"
Une autre variante est la fonction substr_replace, qui remplace le texte dans une partie d'une chaîne.
var_dump(substr_replace("Boo", "0", 1, 1)); // string(3) "B0o"
var_dump(substr_Replace("Boo", "ts", strlen("Boo"))); // string(5) "Boots"
Disons que vous voulez trouver un mot spécifique dans une chaîne - et ne voulez pas utiliser 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)
Une autre option est une analyse très simple d'un email.
$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");
Ou même en mettant le "Continue reading" ou "..." à la fin d'un texte de présentation
$blurb = "Lorem ipsum dolor sit amet";
$limit = 20;
var_dump(substr($blurb, 0, $limit - 3) . '...'); // string(20) "Lorem ipsum dolor..."