52 votes

Obtenir la première ligne d'une chaîne en PHP

En PHP 5.3, il y a une fonction sympa qui semble faire ce que je veux:

strstr(input,"\n",true)

Malheureusement, le serveur utilise PHP 5.2.17 et le troisième paramètre facultatif de strstr n'est pas disponible. Existe-t-il un moyen d'atteindre cela dans les versions précédentes en une seule ligne ?

0 votes

Vous voudrez peut-être utiliser des guillemets doubles autour de cela \n. Quand je l'avais entre apostrophes en créant du contenu de courrier électronique, le caractère de saut de ligne \n était simplement affiché comme des caractères normaux.

1 votes

Pourquoi la restriction de une seule ligne ?

127voto

Pour les textes relativement courts, où les lignes peuvent être délimitées par un ("\n") ou deux ("\r\n") caractères, la solution en une seule ligne pourrait être comme suit

$line = preg_split('#\r?\n#', $input, 2)[0];

pour n'importe quelle séquence avant le premier saut de ligne, même s'il s'agit d'une chaîne vide,

ou

$line = preg_split('#\r?\n#', ltrim($input), 2)[0];

pour la première chaîne non vide.

Cependant, pour les grands textes, cela pourrait poser des problèmes de mémoire, donc dans ce cas strtok mentionné ci-dessous ou une solution basée sur substr présentée dans les autres réponses devraient être préférées.

Lorsque cette réponse a été écrite pour la première fois, il y a près d'une décennie, elle présentait quelques nuances subtiles

  • elle était trop localisée, en suivant le Post d'ouverture avec l'hypothèse que le délimiteur de ligne est toujours un unique caractère "\n", ce qui n'est pas toujours le cas. Utiliser PHP_EOL n'est pas la solution car nous pouvons être confrontés à des données externes, non affectées par les paramètres du système local
  • il était supposé que nous avons besoin de la première chaîne non vide
  • il n'y avait pas moyen d'utiliser à la fois explode() ou preg_split() en une ligne, d'où une astuce avec strtok() était proposée. Cependant, peu de temps après, grâce à la Syntaxe de Variable Uniforme, proposée par Nikita Popov, il est devenu possible d'utiliser l'une de ces fonctions en une seule ligne soignée

mais comme cette question a gagné en popularité, il est préférable de couvrir tous les cas particuliers possibles dans la réponse. Mais pour des raisons historiques, voici la solution originale:

$str = strtok($input, "\n");

qui renverra la première ligne non vide du texte au format unix.

Cependant, étant donné que les délimiteurs de ligne peuvent être différents et que le comportement de strtok() n'est pas si direct, car "Les caractères de délimitation au début ou à la fin de la chaîne sont ignorés", comme le dit la page de manuel pour la fonction strtok() originale en C, je conseillerais maintenant d'utiliser cette fonction avec prudence.

0 votes

Je ne dirais pas que c'est le plus rapide (Et je ne me préoccuperai pas du tout de la comparaison de vitesse) mais apparemment c'est le plus court

23 votes

Coder en PHP depuis plus d'une décennie maintenant et je n'ai jamais vu cette fonction :D +1

0 votes

J'ai utilisé ce fragment de code pour obtenir la première ligne de l'en-tête de réponse de SOAP : echo strtok($client->__getLastResponseHeaders(), "\n"); => ".1 200 OK"

16voto

Connor Gurney Points 628

Il est tard mais vous pourriez utiliser explode.

8 votes

Pourquoi utilisez-vous des clés de chaîne dans cet exemple? Devrait-il être $lines[0]?

2 votes

Note : si vous avez uniquement besoin de la première ligne, cette méthode est inefficace. Par exemple, si $string fait cent mégaoctets et que la première ligne ne représente que quelques octets, cette solution gaspille cent mégaoctets de mémoire et votre script pourrait même être arrêté si vous atteignez la limite de mémoire.

0 votes

actuel(explode("\n", $chaîne)); raccourcit cela et résout le problème de variable intermédiaire et de gaspillage de mémoire.

7voto

Marc B Points 195501
$first_line = substr($fulltext, 0, strpos($fulltext, "\n"));

ou quelque chose d'approchant ferait l'affaire. Laid, mais fonctionnel.

3voto

Sirko Points 32515

Essayer

substr( input, 0, strpos( input, "\n" ) )

2voto

Krimo Points 651

echo str_replace(strstr($input, '\n'),'',$input);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X