【问题标题】:Obtain first line of a string in PHP在PHP中获取字符串的第一行
【发布时间】:2012-02-24 05:49:46
【问题描述】:

在 PHP 5.3 中有一个 nice function 似乎可以满足我的要求:

strstr(input,"\n",true)

很遗憾,服务器运行的是 PHP 5.2.17,并且strstr 的可选第三个参数不可用。有没有办法在以前的版本中实现这一点?

【问题讨论】:

  • 您可能希望在 \n 周围使用双引号。当我在创建电子邮件内容时使用单引号时,\n 只是作为常规字符而不是换行符出现。
  • 为什么要限制one line

标签: php string newline strstr


【解决方案1】:

鉴于一行可以由一个 ("\n") 或两个 ("\r\n") 字符分隔,最安全的方法是

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

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

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

对于第一个非空字符串。

大约十年前首次编写此答案时,它具有一些细微差别

  • 它过于本地化,在开头帖子之后假设行分隔符始终是单个“\n”字符,但情况并非总是如此。使用PHP_EOL 不是解决方案,因为我们可以处理外部数据,不受本地系统设置的影响
  • 假设我们需要第一个非空字符串
  • 没有办法在一行中使用explode()preg_split(),因此提出了strtok() 的技巧。然而,不久之后,感谢Nikita Popov 提出的Uniform Variable Syntax,可以在一个简洁的单行中使用这些功能之一

但是随着这个问题越来越受欢迎,有必要在答案中涵盖所有可能的边缘情况。但由于历史原因,这里是原始答案

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

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

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

【讨论】:

  • 我不会说它是最快的(而且我根本不会用速度比较来打扰自己)但它显然是 最短的
  • 编码 PHP 十多年了,从未见过这个函数 :D +1
  • 这包括新行字符。所以$str = rtrim(strtok($input, "\n")); 会让它变得完美。
  • 将返回第一行非空
  • 使用 PHP_EOL 将避免任何 UNIX/WIndows 纠缠。
【解决方案2】:

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

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

【讨论】:

  • 为什么在这个例子中使用字符串键?应该是$lines[0]
  • 注意:如果只需要第一行,效率低。例如。如果 $string 是 100 兆字节,而第一行只有一些字节,则此解决方案会浪费 100 兆字节的内存,并且您的脚本甚至可能在您达到内存限制时终止。
  • current(explode("\n", $string)); 缩短了这个,解决了中间变量和内存浪费的问题。
【解决方案3】:
$first_line = substr($fulltext, 0, strpos($fulltext, "\n"));

或者类似的东西可以解决问题。丑陋,但可行。

【讨论】:

    【解决方案4】:

    试试

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        试试这个:

        substr($text, 0, strpos($text, chr(10))
        

        【讨论】:

          【解决方案7】:
          list($line_1, $remaining) = explode("\n", $input, 2);
          

          如果您想重复操作,可以轻松获取顶部行和留下的内容。否则按照建议使用 substr。

          【讨论】:

          • 你可以省略剩余部分
          • 你可以,但正如我所说,如果你想要前 X 行然后使用我原来的 "list($line_1, $remaining) = explode("\n", $input, 2);"将允许重复操作。有了这个编辑,我的帖子就毫无意义了!?似乎是一个非常奇怪的编辑......
          • 对于后续调用 strtok 仍然会更好。
          【解决方案8】:

          不依赖于换行符的类型。

          (($pos=strpos($text,"\n"))!==false) || ($pos=strpos($text,"\r"));
          
          $firstline = substr($text,0,(int)$pos);
          

          $firstline 现在包含文本或空字符串的第一行,如果没有找到中断符号(或中断符号是文本中的第一个符号)。

          【讨论】:

            【解决方案9】:

            您可以将strpossubstr 结合使用。首先找到字符所在的位置,然后返回字符串的那部分。

            $pos = strpos(input, "\n");
            
            if ($pos !== false) {
            echo substr($input, 0, $pos);
            } else {
            echo 'String not found';
            }
            

            这是你想要的吗?

            l.e. 没有注意到单行限制,所以这并不适用。您可以按照其他人的建议将这两个函数组合在一行中,或者您可以根据需要创建一个将在一行代码中调用的自定义函数。您的选择。

            【讨论】:

            • 一行限制?有什么原因吗?你知道你总是可以创建自己的函数,以后只需 one line 的代码就可以调用它,对吧?
            【解决方案10】:

            很多时候字符串操作会遇到以空行开头的变量,所以不要忘记评估你是否真的想在字符串的开头和结尾考虑白线,或者修剪它。此外,为避免操作系统错误,请使用 PHP_EOL 以跨平台兼容的方式查找换行符 (When do I use the PHP constant "PHP_EOL"?)。

            $lines = explode(PHP_EOL, trim($string));
            echo $lines[0];
            

            【讨论】:

              【解决方案11】:

              一种将字符串的前 n 行作为字符串获取的快速方法,同时保留换行符。

              示例 $multilinetxt

              的前 6 行
              echo join("\n",array_splice(explode("\n", $multilinetxt),0,6));
              

              可以快速适应捕获特定的文本块,例如从第 10 行到第 13 行:

              echo join("\n",array_splice(explode("\n", $multilinetxt),9,12)); 
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2015-03-27
                • 2011-11-20
                • 2011-07-31
                • 2010-12-28
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2014-09-01
                相关资源
                最近更新 更多