Ricerca…


Osservazioni

Regex dovrebbe essere usato per altri usi oltre a ottenere stringhe di corde o altrimenti tagliare le stringhe in pezzi.

Divisione di una stringa tramite separatori

explode e strstr sono metodi più semplici per ottenere sottostringhe dai separatori.

Una stringa contenente diverse parti di testo separate da un carattere comune può essere divisa in parti con la funzione explode .

$fruits = "apple,pear,grapefruit,cherry";
print_r(explode(",",$fruits)); // ['apple', 'pear', 'grapefruit', 'cherry']

Il metodo supporta anche un parametro limite che può essere utilizzato come segue:

$fruits= 'apple,pear,grapefruit,cherry';

Se il parametro limit è zero, allora viene trattato come 1.

print_r(explode(',',$fruits,0)); // ['apple,pear,grapefruit,cherry']

Se il limite è impostato e positivo, la matrice restituita conterrà un massimo di elementi limite con l'ultimo elemento contenente il resto della stringa.

print_r(explode(',',$fruits,2)); // ['apple', 'pear,grapefruit,cherry']

Se il parametro limite è negativo, vengono restituiti tutti i componenti tranne l'ultimo limite.

print_r(explode(',',$fruits,-1)); // ['apple', 'pear', 'grapefruit']

explode può essere combinato con una list per analizzare una stringa in variabili in una riga:

$email = "[email protected]";
list($name, $domain) = explode("@", $email);

Tuttavia, assicurarsi che il risultato di explode contiene elementi sufficienti, o un avvertimento indice indefinita sarebbe stato attivato.

strstr allontana o restituisce solo la sottostringa prima della prima occorrenza dell'ago dato.

$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"

Ricerca di una sottostringa con strpos

strpos può essere inteso come il numero di byte nel pagliaio prima della prima occorrenza dell'ago.

var_dump(strpos("haystack", "hay")); // int(0)
var_dump(strpos("haystack", "stack")); // int(3)
var_dump(strpos("haystack", "stackoverflow"); // bool(false)

Verifica se esiste una sottostringa

Fai attenzione a controllare TRUE o FALSE perché se viene restituito un indice di 0, un'istruzione if lo vedrà come 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";
}

Uscita dell'intero esempio:

1. I did not found your string 
2. I found your string 
3. I did not found your string 

Cerca a partire da 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

Ottieni tutte le occorrenze di una sottostringa

$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]

Analisi della stringa utilizzando le espressioni regolari

preg_match può essere usato per analizzare la stringa usando l'espressione regolare. Le parti di espressione racchiuse tra parentesi sono chiamate subpatterns e con esse puoi scegliere singole parti della stringa.

$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
}

Produzione

Array
(
    [0] => <a href="http://example.org">My Link</a>
    [1] => http://example.org
    [2] => My Link
)

substring

La sottostringa restituisce la parte di stringa specificata dai parametri di avvio e lunghezza.

var_dump(substr("Boo", 1)); // string(2) "oo"

Se esiste la possibilità di incontrare stringhe di caratteri multibyte, sarebbe più sicuro usare 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æ"

Un'altra variante è la funzione substr_replace, che sostituisce il testo all'interno di una porzione di una stringa.

var_dump(substr_replace("Boo", "0", 1, 1)); // string(3) "B0o"
var_dump(substr_Replace("Boo", "ts", strlen("Boo"))); // string(5) "Boots"

Diciamo che vuoi trovare una parola specifica in una stringa e non vuoi usare 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)

Un'altra opzione è l'analisi di base di un'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");

O anche mettendo il "Continua a leggere" o "..." alla fine di un blurb

$blurb = "Lorem ipsum dolor sit amet";
$limit = 20;

var_dump(substr($blurb, 0, $limit - 3) . '...'); // string(20) "Lorem ipsum dolor..."


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow