2010-10-13 4 views
7

J'écris une page PHP qui analyse une URL donnée. Ce que je peux faire est de trouver la première occurrence seulement, mais quand je lui fais écho, j'obtiens une autre valeur plutôt que le donné.Trouver plusieurs positions de chaînes en PHP

c'est ce que j'ai fait jusqu'à maintenant. Je sais qu'une boucle peut être utilisée, mais je ne connais pas la condition ni le corps de la boucle serait.

Et comment puis-je montrer la sortie dont j'ai besoin ??

+0

Je ne sais pas ce que vous voulez exactement avec ce code, mais il ne me semble pas clair quelle variable vous souhaitez obtenir avec. A ce moment, vous êtes censé faire écho exactement le contenu de $ toFind, alors pourquoi ne pas echo $ toFind quand une correspondance est trouvée? Ou est-ce que vous avez trop d'importance? Le problème semble toutefois provenir de la fonction htmlspecialchars(), qui peut augmenter la longueur et la disposition de la chaîne d'origine. Si vous souhaitez afficher le texte correspondant, assurez-vous de l'utiliser sur la ligne de sous-traitance. –

+0

@Pelle ten Cate: comme vous pouvez le voir, la réponse envoyée par codaddict était la même que la vôtre.Et je ne veux pas juste echo $ toFind, parce que je vais utiliser la position trouvée pour obtenir du contenu après celui que je trouve. – sikas

Répondre

16

Cela se produit car vous utilisez strpos sur le htmlspecialchars($str) mais vous utilisez substr sur $str.

htmlspecialchars() convertit les caractères spéciaux en entités HTML. Prenez un petit exemple:

// search 'foo' in '&foobar' 

$str = "&foobar"; 
$toFind = "foo"; 

// htmlspecialchars($str) gives you "&foobar" 
// as & is replaced by &. strpos returns 5 
$pos = strpos(htmlspecialchars($str),$toFind); 

// now your try and extract 3 char starting at index 5!!! in the original 
// string even though its 'foo' starts at index 1. 
echo substr($str,$pos,strlen($toFind)); // prints ar 

Pour résoudre ce problème utilisent le même botte de foin dans les deux fonctions.

Pour vous répondre à l'autre question de trouver toutes les occurrences d'une chaîne dans l'autre, vous pouvez utiliser le 3ème argument de strpos, offset, qui spécifie où chercher. Exemple:

$str = "&foobar&foobaz"; 
$toFind = "foo"; 
$start = 0; 
while($pos = strpos(($str),$toFind,$start) !== false) { 
     echo 'Found '.$toFind.' at position '.$pos."\n"; 
     $start = $pos+1; // start searching from next position. 
} 

sortie:

Trouvé foo en position 1
Trouvé foo à la position 8

+0

Pour développer un peu, htmlspecialchars remplace certains caractères par plusieurs nouveaux, ce qui signifie que vous ne pouvez pas utiliser les mêmes index dans les deux chaînes et attendre le même résultat. – dutt

+0

Cela a résolu un problème qui est la sortie. Mais qu'en est-il de l'autre problème? – sikas

+0

C'est ce que je cherchais: D ... merci. – sikas

5

Utilisation:

while(($pos = strpos(($str),$toFind,$start)) != false) { 

explenation: Set ) après false derrière $start), de sorte que $pos = strpos(($str),$toFind,$start) est placé entre ().

utilisent également != false, parce que php.net dit: « Cette fonction peut retourner FALSE, mais elle peut aussi retourner une valeur non booléenne qui évalue à FALSE, comme 0 ou "". Veuillez lire la section sur les booléens pour plus d'informations. Utilisez l'opérateur === pour tester la valeur de retour de cette fonction.

+0

Ceci est le seul qui n'a pas créé une boucle infinie – jocken

3
$string = '\n;alskdjf;lkdsajf;lkjdsaf \n hey judeee \n'; 
$pattern = '\n'; 
$start = 0; 
while(($newLine = strpos($string, $pattern, $start)) !== false){ 
    $start = $newLine + 1; 
    echo $newLine . '<br>'; 
} 

Cela fonctionne hors de la porte, et ne fonctionne pas comme une boucle infinie qui précède, et! == permet un match à la position 0.

+0

, la réponse acceptée ci-dessus cloue presque le problème mais $ pos est toujours VRAI qui évalue à 1 lors de l'impression, conduisant à une boucle infinie ... merci @ user1371910 & marco – Carlton

1
$offset=0; 
$find="is"; 
$find_length= strlen($find); 
$string="This is an example string, and it is an example"; 
while ($string_position = strpos($string, $find, $offset)) { 
    echo '<strong>'.$find.'</strong>'.' Found at '.$string_position.'</br>'; 
    $offset=$string_position+$find_length; 
} 
Questions connexes