1

私の$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";
 }

}
4

5 に答える 5

5

紹介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()は、トークン (または区切り記号) に基づいて文字列をチャンクします。このコードでは、各行がチャンクであり、チャンクごとに最初の 6 文字とそれに続く改行のみを表示します。

アップデート

preg_replace()次のように使用することもできます。

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

最初の 6 文字がキャプチャされ、その後に残りの行が続きます。次に、メモリ キャプチャを使用して置換を実行します。

于 2013-09-06T03:58:49.493 に答える
3

注-投稿されたすべての正解の中で、これはおそらく最もメモリ効率が悪いですが、ワンライナーです。

ワンライナーを投げるだけです(php 5.3以降で動作します)。これは、入力が $str であり、行に各行の最初の 6 文字の改行区切り文字列が含まれていることを前提としています。

$lines = implode("\n", array_map(function($a){return substr($a, 0, 6); }, explode("\n",$str)));
于 2013-09-06T03:59:42.180 に答える
2

コード:

$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
于 2013-09-06T03:58:45.337 に答える