【问题标题】:Substring each line of the string子串字符串的每一行
【发布时间】:2013-09-10 01:38:02
【问题描述】:

在我的 $result 变量中,我有一个 5 行字符串:

0100014746510106200140001020061780000000041666670072860103508101 0100008030950106200270002020139450000000020000006663540105338500 0100004586400106200270002020206660000000003700000511890102603900 0100008204530106200270002020218320000000011666670014450101008906 0100015309660106200270002021023010000000019400001666460105319807

我怎样才能substr() 每行...为了得到这个结果:

010001
010000
010000
010000
010001

只需要获取每行的前6列...请帮助...

PHP 代码:

$file = 'upload/filter.txt';
$searchfor = $_POST['search'];
$filename = $_POST['filename'];
$btn = $_POST['button'];


if($btn == 'GENERATE' ) {

//prevents the browser from parsing this as HTML.
//header('Content-Type: text/plain');
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");;
header("Content-Disposition: attachment;filename=".$filename.".txt ");
header("Content-Transfer-Encoding: binary ");


// get the file contents, assuming the file to be readable (and exist)
$contents = file_get_contents($file);

// escape special characters in the query
$pattern = preg_quote($searchfor, '/');

// finalise the regular expression, matching the whole line
 $pattern = "/^.*$pattern.*\$/m";


 // search, and store all matching occurences in $matches
 if(preg_match_all($pattern, $contents, $matches)){
 $result = implode("\n", $matches[0]);
 echo $result;


  }

else{
 echo "No matches found";
 }

}

【问题讨论】:

  • 在换行时爆炸然后循环
  • @Backtrack 我更新了帖子
  • @Bongsky 。如果您想使用换行符作为分隔符将字符串拆分(分解)为数组,explode() 不是要使用的工具。参考我的答案

标签: php string substring


【解决方案1】:

介绍strtok()

$text = <<<EOM
0100014746510106200140001020061780000000041666670072860103508101
0100008030950106200270002020139450000000020000006663540105338500
0100004586400106200270002020206660000000003700000511890102603900
0100008204530106200270002020218320000000011666670014450101008906
0100015309660106200270002021023010000000019400001666460105319807
EOM;

for ($line = strtok($text, "\n"); $line !== false; $line = strtok("\n")) {
        echo substr($line, 0, 6), "\n";
}

函数strtok() 根据标记(或分隔符)对字符串进行分块;在这段代码中,每一行都是一个块,对于每个块,您只显示前六个字符,后跟一个换行符。

更新

你也可以像这样使用preg_replace()

echo preg_replace('/^(.{6}).*/m', '$1', $text);

它捕获前六个字符,然后是该行的其余部分;然后它使用内存捕获来执行替换。

【讨论】:

  • 可能是最好的解决方案,因为它不需要创建新的数据结构来复制数据,因此会消耗内存。
【解决方案2】:

注意 - 在所有已发布的正确答案中,这可能是内存效率最低的,但嘿,它是单行的。

只是加入一个单行(将适用于 php 5.3 及更高版本)。这假设您的输入是 $str 并且行将包含每行前 6 个字符的换行符分隔的字符串。

$lines = implode("\n", array_map(function($a){return substr($a, 0, 6); }, explode("\n",$str)));

【讨论】:

  • 但现在它是一个数组 ;-)
  • 更好;可惜字符串 -> 数组 -> 字符串转换虽然:)
  • @Jack 我已经对你投了赞成票,并承认这是更好的解决方案......足以击败我的答案:D
【解决方案3】:

代码:

$str = "0100014746510106200140001020061780000000041666670072860103508101\n"
      ."0100008030950106200270002020139450000000020000006663540105338500\n"
      ."0100004586400106200270002020206660000000003700000511890102603900\n"
      ."0100008204530106200270002020218320000000011666670014450101008906\n"
      ."0100015309660106200270002021023010000000019400001666460105319807\n";

if( preg_match_all('#^\d{6}#m',$str,$matches) ){
  echo join("\n",$matches[0]);
}

结果:

010001
010000
010000
010000
010001

【讨论】:

    【解决方案4】:

    试试:

    <?php
    $str = explode(PHP_EOL, "
            0100014746510106200140001020061780000000041666670072860103508101 
            0100008030950106200270002020139450000000020000006663540105338500 
            0100004586400106200270002020206660000000003700000511890102603900 
            0100008204530106200270002020218320000000011666670014450101008906 
            0100015309660106200270002021023010000000019400001666460105319807
    ");
    for($i = 0; $i<count($str);$i++){
        if($str[$i] != NULL)
            echo substr((string)$str[$i],0,9);
    }
    ?>
    

    PHP_EOL => 此平台的正确“行尾”符号。自 PHP 4.3.10 和 PHP 5.0.2 起可用

    PHP : Predefined Constants

    如果 PHP_EOL 不可用,您也可以使用 '\r\n'。

    【讨论】:

    • 你应该总是在循环结构之外进行计数
    • 感谢您的回复...如果可行,我一定会尝试并返回,谢谢
    • PHP_EOL 上拆分并不总是可移植的。
    • 我不知道为什么 substr($str[$i], 0, 6) 不起作用。 0, 9 正在工作。
    【解决方案5】:

    基本上:

    $x=explode("\n",$result); //new line will depend on os ("\r\n"|"\r")
    
    foreach($x as $line){
    //substr $line
    }
    

    【讨论】:

    • 感谢您的回复...如果可行,我一定会尝试并返回,谢谢
    猜你喜欢
    • 2020-02-20
    • 1970-01-01
    • 2015-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 2014-09-23
    • 1970-01-01
    相关资源
    最近更新 更多