J'ai besoin d'une fonction qui renvoie la sous-chaîne entre deux mots (ou deux caractères). Je me demande s'il existe une fonction php qui y parvient. Je ne veux pas penser aux regex (enfin, je pourrais en faire une mais je ne pense vraiment pas que ce soit la meilleure voie à suivre). Pensée strpos
et substr
fonctions. Voici un exemple:
$string = "foo I wanna a cake foo";
Nous appelons la fonction: $substring = getInnerSubstring($string,"foo");
Elle renvoie: "Je veux un gâteau".
Merci d'avance.
Mise à jour:
Eh bien, jusqu'à présent, je peux juste obtenir une sous-chaîne entre deux mots dans une seule chaîne, permettez-moi de me laisser aller un peu plus loin et de me demander si je peux étendre l'utilisation de getInnerSubstring($str,$delim)
pour obtenir toutes les chaînes entre les valeurs de délimitation, exemple:
$string =" foo I like php foo, but foo I also like asp foo, foo I feel hero foo";
Je reçois un tableau comme {"I like php", "I also like asp", "I feel hero"}
.
\Illuminate\Support\Str::between('This is my name', 'This', 'name');
c'est pratique. laravel.com/docs/7.x/helpers#method-str-betweenRéponses:
Si les chaînes sont différentes (par exemple: [foo] & [/ foo]), jetez un œil à ce post de Justin Cook. Je copie son code ci-dessous:
la source
Les expressions régulières sont la voie à suivre:
onlinePhp
la source
Exemple d'utilisation:
la source
Exemple d'utilisation:
Si vous souhaitez supprimer les espaces blancs environnants, utilisez
trim
. Exemple:la source
la source
utilisez la fonction strstr php deux fois.
les sorties:
"is a great day to"
la source
J'aime les solutions d'expression régulière mais aucune des autres ne me convient.
Si vous savez qu'il n'y aura qu'un seul résultat, vous pouvez utiliser ce qui suit:
Remplacez AVANT et APRÈS par les délimiteurs souhaités.
Gardez également à l'esprit que cette fonction renverra la chaîne entière au cas où rien ne correspond.
Cette solution est multiligne mais vous pouvez jouer avec les modificateurs en fonction de vos besoins.
la source
Pas un pro de php. mais je suis récemment tombé sur ce mur et c'est ce que j'ai trouvé.
la source
Si vous utilisez
foo
comme délimiteur, regardezexplode()
la source
Exemple:
Cela reviendra "le gars du milieu".
la source
Si vous avez plusieurs récurrences à partir d'une seule chaîne et que vous avez des modèles [début] et [\ fin] différents. Voici une fonction qui génère un tableau.
la source
Voici une fonction
Utilisez-le comme
Sortie (notez qu'il renvoie des espaces devant et à la et de votre chaîne si elles existent)
Si vous voulez rogner le résultat, utilisez une fonction comme
Résultat : cette fonction retournera false si elle
$boundstring
n'a pas été trouvée dans$string
ou si elle$boundstring
n'existe qu'une seule fois dans$string
, sinon elle retourne une sous-chaîne entre la première et la dernière occurrence de$boundstring
in$string
.Références
la source
IF
clause parlez-vous? peut-être que j'ai fait une faute de frappe, mais pour être honnête, je ne vois rien de bizarre pour le moment. Les deuxIF
s que j'ai utilisés dans la fonction ci-dessus ont des parenthèses appropriées. Le premier aIF
également des accolades (accolades) qui entourent le bloc de 2 lignes, le secondIF
n'en a pas besoin car il s'agit d'un code sur une seule ligne. Qu'est-ce qui me manque?Amélioration de la réponse d' Alejandro . Vous pouvez laisser les arguments
$start
ou$end
vides et il utilisera le début ou la fin de la chaîne.la source
Utilisation:
la source
Code un peu amélioré de GarciaWebDev et Henry Wang. Si $ start ou $ end vide est donné, la fonction renvoie les valeurs du début ou de la fin de la chaîne $. L'option inclusive est également disponible, que nous souhaitons ou non inclure le résultat de la recherche:
la source
Je dois ajouter quelque chose au message de Julius Tilvikas. J'ai cherché une solution comme celle qu'il a décrite dans son article. Mais je pense qu'il y a une erreur. Je n'obtiens pas vraiment la chaîne entre deux chaînes, j'en ai aussi plus avec cette solution, car je dois soustraire la longueur de la chaîne de début. Quand faire cela, j'obtiens vraiment la chaîne entre deux chaînes.
Voici mes modifications de sa solution:
Greetz
V
la source
Essayez ceci, son travail pour moi, obtenez des données entre les mots de test .
la source
Dans le
strpos
style PHP, cela reviendrafalse
si la marque de débutsm
ou la marque de finem
ne sont pas trouvées.Ce résultat (
false
) est différent d'une chaîne vide qui est ce que vous obtenez s'il n'y a rien entre les marques de début et de fin.La fonction retournera uniquement la première correspondance.
Il est évident, mais il convient de mentionner que la fonction recherchera d'abord
sm
, puisem
.Cela implique que vous n'obtiendrez peut-être pas le résultat / comportement souhaité si la
em
recherche doit d'abord être effectuée, puis la chaîne doit être analysée en arrière à la recherche desm
.la source
C'est la fonction que j'utilise pour cela. J'ai combiné deux réponses en une seule fonction pour des délimiteurs simples ou multiples.
Pour une utilisation simple (renvoie deux):
Pour obtenir chaque ligne d'une table en tableau de résultats:
la source
j'utilise
Sous-titre <TAG> pour le délimiteur de votre choix.
la source
une version éditée de ce qu'Alejandro García Iglesias a mis.
Cela vous permet de choisir un emplacement spécifique de la chaîne que vous souhaitez obtenir en fonction du nombre de fois où le résultat est trouvé.
usage:
strpos a une entrée facultative supplémentaire pour démarrer sa recherche à un point spécifique. donc je stocke la position précédente dans $ cPos donc quand la boucle for vérifie à nouveau, elle commence à la fin de là où elle s'est arrêtée.
la source
Une grande majorité des réponses ici ne répondent pas à la partie éditée, je suppose qu'elles ont été ajoutées auparavant. Cela peut être fait avec regex, comme le mentionne une réponse. J'avais une approche différente.
Cette fonction recherche $ string et trouve la première chaîne entre $ start et $ end, en commençant à la position $ offset. Il met ensuite à jour la position $ offset pour pointer vers le début du résultat. Si $ includeDelimiters est vrai, il inclut les délimiteurs dans le résultat.
Si la chaîne $ start ou $ end n'est pas trouvée, elle renvoie null. Il renvoie également null si $ string, $ start ou $ end sont une chaîne vide.
La fonction suivante recherche toutes les chaînes situées entre deux chaînes (pas de chevauchements). Il nécessite la fonction précédente et les arguments sont les mêmes. Après l'exécution, $ offset pointe vers le début de la dernière chaîne de résultat trouvée.
Exemples:
str_between_all('foo 1 bar 2 foo 3 bar', 'foo', 'bar')
donne[' 1 ', ' 3 ']
.str_between_all('foo 1 bar 2', 'foo', 'bar')
donne[' 1 ']
.str_between_all('foo 1 foo 2 foo 3 foo', 'foo', 'foo')
donne[' 1 ', ' 3 ']
.str_between_all('foo 1 bar', 'foo', 'foo')
donne[]
.la source
Utilisation:
la source
J'ai eu quelques problèmes avec la fonction get_string_between (), utilisée ici. Je suis donc venu avec ma propre version. Peut-être que cela pourrait aider les gens dans le même cas que le mien.
la source
a écrit ces derniers il y a quelque temps, l'a trouvé très utile pour un large éventail d'applications.
la source
Avec quelques erreurs de capture. Plus précisément, la plupart des fonctions présentées nécessitent l'existence de $ end, alors qu'en fait, dans mon cas, j'avais besoin qu'il soit optionnel. Utiliser this is $ end est facultatif, et évaluer FALSE si $ start n'existe pas du tout:
la source
La version UTF-8 de la réponse @Alejandro Iglesias fonctionnera pour les caractères non latins:
la source
Vous avez la meilleure solution pour cela de tonyspiro
la source
Cela peut être facilement fait en utilisant cette petite fonction:
la source
Je l'utilise depuis des années et cela fonctionne bien. Pourrait probablement être rendu plus efficace, mais
grabstring ("Test string", "", "", 0) renvoie la chaîne de test
grabstring ("Test string", "Test", "", 0) renvoie la chaîne
grabstring ("Test string", "s", "", 5) renvoie la chaîne
}
la source