在 PHP 中获取字符串的第一行

2022-08-30 10:34:10

在 PHP 5.3 中有一个不错的函数,它似乎可以做我想要的:

strstr(input,"\n",true)

不幸的是,服务器运行 PHP 5.2.17,可选的第三个参数不可用。有没有办法在以前的版本中一行实现此目的?strstr


答案 1

对于相对较短的文本,其中行可以由一个(“\n”)或两个(“\r\n”)字符分隔,单行可以是这样的

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

对于第一个换行符之前的任何序列,即使它是空字符串,

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

对于第一个非空字符串。

但是,对于大型文本,它可能会导致内存问题,因此在这种情况下,下面提到的或其他答案中基于的解决方案应该是首选。strtoksubstr

大约十年前,当这个答案首次被写出来时,它有一些微妙的细微差别。

  • 它太本地化了,在开场白之后,假设行分隔符始终是单个“\n”字符,但情况并非总是如此。使用不是解决方案,因为我们可以处理外部数据,而不受本地系统设置的影响PHP_EOL
  • 假设我们需要第一个非空字符串
  • 没有办法使用任何一个或在一行中使用,因此提出了一个技巧。然而,不久之后,由于Nikita Popov提出的统一变量语法,可以在一个整洁的单行中使用这些函数之一。explode()preg_split()strtok()

但是随着这个问题越来越受欢迎,最好在答案中涵盖所有可能的边缘情况。但出于历史原因,这里是原始的解决方案:

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

这将返回 unix 格式的文本中的第一个非空行。

但是,鉴于行分隔符可能不同,并且 的行为不是那么直接,因为“字符串开头或结尾处的分隔符字符被忽略”,因为它说的是C中原始strtok()函数的手册页,现在我建议谨慎使用此函数。strtok()


答案 2

已经很晚了,但你可以使用爆炸。

<?php
$lines=explode("\n", $string);
echo $lines['0'];
?>

推荐