strpbrk()
La funzione strpbrk() in PHP cerca in una stringa uno qualsiasi di un insieme di caratteri e restituisce la porzione della stringa dal primo carattere trovato.
Introduzione
La funzione strpbrk() in PHP cerca in una stringa uno qualsiasi di un insieme di caratteri e restituisce il resto della stringa a partire dalla prima corrispondenza. Il nome sta per "string pointer break" — scansiona la stringa da sinistra a destra e si ferma (breaks) nel momento in cui incontra un carattere presente nell'insieme di ricerca.
Questo la rende utile per operazioni come "dammi tutto a partire dal primo @, =, o ?" senza dover scrivere un'espressione regolare. Questo articolo copre la sintassi, i valori di ritorno, un'insidia comune riguardo a come viene scelta la corrispondenza e i casi d'uso pratici.
Sintassi
strpbrk(string $haystack, string $char_list): string|false| Parametro | Descrizione |
|---|---|
$haystack | La stringa in cui cercare. |
$char_list | Una stringa che elenca i caratteri da cercare. Ogni carattere è trattato individualmente — "abc" significa "uno qualsiasi tra a, b e c", non la sottostringa "abc". |
Valore di ritorno: la porzione di $haystack dal primo carattere corrispondente fino alla fine della stringa. Se nessuno dei caratteri in $char_list è presente, restituisce false.
strpbrk() è case-sensitive: cercare "A" non corrisponde a una a minuscola.
Esempio di base
Output:
Found 'llo World' in 'Hello World'Un risultato che sorprende spesso: il risultato è llo World, non World. La funzione restituisce a partire dal primo carattere corrispondente che incontra durante la scansione da sinistra a destra. Anche se W è nella lista di ricerca, la l minuscola in "Hello" compare prima nella stringa, quindi il risultato inizia da lì. L'ordine in $char_list non ha importanza — conta solo la posizione nella stringa.
La corrispondenza è posizionale, non basata sull'ordine della lista
È facile supporre che strpbrk() rispetti l'ordine dei caratteri passati. Non è così — restituisce a partire dal carattere di ricerca che compare prima nella stringa:
<?php
// 'o' and 'q' are both in the list; 'q' appears first in the haystack.
echo strpbrk("The quick brown fox", "oq"); // quick brown foxOutput:
quick brown foxUso pratico: suddivisione su un delimitatore
Poiché strpbrk() restituisce "tutto dal delimitatore in poi", è possibile abbinarla a substr() per ottenere il valore dopo un separatore:
<?php
$pair = "name=John";
$fromEquals = strpbrk($pair, "="); // "=John"
$value = substr($fromEquals, 1); // drop the leading "=" -> "John"
echo $value;Output:
JohnFunziona bene anche quando si accettano più delimitatori possibili contemporaneamente:
<?php
$line = "[email protected]";
echo strpbrk($line, "@?#"); // @example.comOutput:
@example.comGestione del caso "non trovato"
Quando nessun carattere della lista è presente nella stringa, strpbrk() restituisce false. Confrontare sempre con l'operatore stretto !== affinché un risultato vuoto ma valido non venga scambiato per un fallimento:
<?php
$result = strpbrk("PHP 8.4", "AEIOU"); // uppercase vowels — none present (case-sensitive)
if ($result === false) {
echo "No matching character found.";
} else {
echo $result;
}Output:
No matching character found.strpbrk() vs. funzioni correlate
| Funzione | Cerca | Restituisce |
|---|---|---|
strpbrk() | uno qualsiasi di più caratteri | il resto della stringa dalla prima corrispondenza, o false |
| strpos() | una singola sottostringa | la posizione numerica della corrispondenza, o false |
| strstr() | una singola sottostringa | il resto della stringa da quella sottostringa, o false |
| strrchr() | l'ultima occorrenza di un carattere | il resto della stringa da quel punto, o false |
Utilizzare strpbrk() quando si ha un piccolo insieme di caratteri a cui reagire e si vuole la coda della stringa. Se si cerca sempre una sola sottostringa fissa, strstr() o strpos() è più chiaro. Per la corrispondenza basata su pattern, usare preg_match().
Conclusione
strpbrk() restituisce il resto di una stringa a partire dal primo carattere che corrisponde a qualsiasi carattere nell'insieme di ricerca, o false se non c'è corrispondenza. Ricordare che la corrispondenza viene scelta in base alla posizione nella stringa, non dall'ordine della lista di ricerca, e che è case-sensitive. È un'alternativa concisa a un'espressione regolare quando si ha bisogno di "tutto dal primo delimitatore in poi".