9
votes

Trouvez plusieurs positions de chaîne dans PHP

Je suis en train d'écrire une page PHP qui analyse une URL donnée. Ce que je peux faire, c'est trouver le premier événement que, pourtant, quand je l'écho, je reçois une autre valeur plutôt que celle donnée.

C'est ce que j'ai fait jusqu'à présent. P>

<?php
$URL = @"my URL goes here";//get from database
$str = file_get_contents($URL);
$toFind = "string to find";
$pos = strpos(htmlspecialchars($str),$toFind);
echo substr($str,$pos,strlen($toFind)) . "<br />";
$offset = $offset + strlen($toFind);
?>


2 commentaires

Je ne sais pas ce que vous voulez exactement avec ce code, mais cela ne semble pas clair pour moi quelle variable vous souhaitez continuer. À ce moment-là, vous êtes censé écho exactement le contenu de $ de toofind, alors pourquoi ne pas écho $ tofind lorsqu'il est trouvé? Ou est-ce que $ pos de trop d'importance pour vous? Le problème semble cependant provenir de la fonction HTMLSpecialchars (), qui pourrait augmenter la longueur et la mise en page de la chaîne d'origine. Si vous souhaitez afficher le texte correspondant, assurez-vous de l'utiliser sur la ligne Substr.


@Pelle dix cate: comme vous pouvez le constater, la réponse qui a été envoyée par CODADDICT était la même que la vôtre. Et je ne veux pas juste faire écho $ TOFDIND, car je vais utiliser la position trouvée pour obtenir du contenu après celui que je trouve.


4 Réponses :


19
votes

Ceci se produit parce que vous utilisez Stros code> sur le htmlspecialchars ($ str) code> mais que vous utilisez substr code> sur $ str .

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

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


6 commentaires

Pour élaborer un peu, HTMLSpecialchars remplace certains caractères avec plusieurs nouveaux, ce qui signifie que vous ne pouvez pas utiliser les mêmes index dans les deux cordes et vous attendre au même résultat.


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


Si FOO est trouvé à la position 0, le programme n'entrera même pas la boucle. Devrait utiliser is_numeric ($ pos = Strows (($ str), $ tofind, $ départ))


Ma mauvaise confusion ! == avec ! = . Le code fonctionne correctement. Merci.


Ce code renvoie une sortie infinie: "Trouvé FOO à la position 1". Qu'est-ce que je fais mal?


Cela crée une boucle infinie dans PHP 5.6.10. Besoin d'ajouter des parens comme celui-ci: tandis que (($ pos = sdred ($ str



5
votes

Utilisation:

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


1 commentaires

C'est le seul qui n'a pas créé une boucle infinie



3
votes
$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>';
}
This works out of the gate, and doesn't run an infinite loop like the above, and the !== allows for a match at position 0.

1 commentaires

D'accord, la réponse acceptée ci-dessus presque ongles Le problème mais $ POS est toujours vrai qui évalue à 1 lorsqu'il est imprimé, conduisant à une boucle infinie ... Merci @ user1371910 & Marco



1
votes
$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;
}

0 commentaires