8721 sujets

Développement web côté serveur, CMS

Bonjour bonjour, et merci d'avance !

Je ne sais plus quoi faire. J'ai fréquemment ce schéma : faire la recherche d'une chaîne commençant par un retour chariot. Mais strpos() ne retourne pas le résultat escompté :
$src = 'a
->->body'; // = a\r\n\t\tbody  = a CR LF TAB TAB body
$pos = strpos($src, '
->->body');
echo $pos; //FALSE au lieu de '1' 


Je précise que le fichier php est en UTF-8 CRLF, et que $src vient de urldecode( $_POST['data'] )
Et que je suis sûr qu'il y a bien du CRLF, autant dans $src que dans le terme recherché.
Enfin, la recherche fonctionne parfaitement lorsqu'il n'y a pas de CRLF (ex, avec '->->body')

C'est moi qui n'ai pas compris un truc ? Smiley ohwell
Merciiii !
Modifié par Gill (25 Mar 2019 - 08:48)
Trouvé !
En fait, si strpos() ne marchait pas, c'était parce que le string de recherche n'était pas comme je l'avais cru : il comportait un CR supplémentaire (en plus du CRLF que j'avais détecté. Je croyais que le CR surnuméraire était ajouté par mon éditeur lors de l'affichage...).

Et le bug venait de plus loin :
$string= file_get_contents($filename);

$filename était bien en UTF-8, mais les retours-chariots étaient variés : parfois LF, parfois CRLF (à cause de copiés collés, je pense).
Or, file_get_contents() a transformé tous les LF en CRLF.
Ce qui fait que les CR + LF ont été transformés en CR + CRLF !
J'avais donc des CRCRLF dans mon string de recherche.

Je suppose que file_get_contents() fait cette traduction automatique parce que je suis sous Windows (et WAMP), et que le résultat serait différent sous Linux (CRLF pour Windows et LF pour Linux). Mais ça fait suer, quand même ! Smiley fache
Modifié par Gill (25 Mar 2019 - 08:45)