3

Webページに2つのスペースのタブ付きデータ列を含むプレーンテキストファイルを表示する必要があります。

私がしたことは、PHPを使用してテキストファイルを読み取り、<pre>タグ間で印刷して、等幅フォントを使用することでした。

<pre>
<?php
  $fn="data.txt";
  $fi=fopen($fn, "r");
  $fc=fread($fi, filesize($fn));         //open and read text file
  fclose($fi);
  $fc=str_replace("\t", "  ", $fc);      //replace tabs with two spaces
  print($fc);                            //print data between PRE tags
?>
</pre>

ほぼ動作しますが、タブが面倒です。タブを2つのスペースに置き換えるのは簡単ですが、空白以外の文字はタブに吸収されるのではなく、押し出されます。真のタブはn-1空白以外の文字を吸収します(ここnで、はタブあたりのスペースの数です)。

たとえば、次の表は次のように表示されます。

|   | 43| 43|  7|   |   |
| 12|128|128|128|   | 53|
|  3|  3|  3|  3|   |   |
|   |   | 21| 21| 39|   |

ただし、すべてのタブをやみくもに2つのスペースに置き換えると、次のようになります。

|    |  43|  43|    7|   |   |
|  12|128|128|128|   | 53|
|   3|   3|   3|   3|   |   |
|   |   |  21|  21|  39|   |

スペース全体を占めないタブを考慮しながら、タブをスペースに変換する(かなり簡単な)方法を見つけようとしていnます。

4

3 に答える 3

6

私はしばらく前にこの関数を書いたことがありますが、役に立つかもしれません:

function tab2space($line, $tab = 4, $nbsp = FALSE) {
    while (($t = mb_strpos($line,"\t")) !== FALSE) {
        $preTab = $t?mb_substr($line, 0, $t):'';
        $line = $preTab . str_repeat($nbsp?chr(7):' ', $tab-(mb_strlen($preTab)%$tab)) . mb_substr($line, $t+1);
    }
    return  $nbsp?str_replace($nbsp?chr(7):' ', '&nbsp;', $line):$line;
}

マルチバイト文字列を処理するためのものでした。数字しかない場合は、を取り除くことができます。これによりmb_、この関数が高速化されます。

fgets[+] これは 1 行で動作することを意図しているため、ファイル全体を一度に処理するのではなく、1 行ずつ処理する必要があることに注意してください。

于 2013-01-13T22:03:08.630 に答える
1

printf関数を使用してみることができます。

ここに例があります:

printf("%4d",'37'); // will print ' 37' (with 2 spaces before 37) 
printf("%6d",'37'); // will print '   37' (with 4 spaces before 37) 
printf("%6d",'337'); // will print '  37' (with 3 spaces before 37) 

形式に関する情報はこちら.

(参考までに、同じトリックは C でも利用できます)

于 2013-01-13T21:29:15.073 に答える
0

まず、すべてのタブとスペースを取り除きます:

$fc=str_replace("\t", "", $fc);
$fc = str_replace(" ", "", $fc);

次に、これらの置換を適用します。ループは、置換が最初に実行されたときに考えられるすべてのケースにヒットしない可能性があるためです。

//deal with the case of two pipes next to each other
while(strpos($fc, "||") !== false)
   $fc = str_replace("||", "|   |", $fc);

//deal with the case of |XX|
while(preg_match('/\|[0-9][0-9]\|/', $fc) !== 0)
    $fc = preg_replace('/\|([0-9])([0-9])\|/', '| ${1}${2}|', $fc);

//deal with the case of |X|
while(preg_match('/\|([0-9])\|/', $fc) !== 0)
   $fc = preg_replace('/\|([0-9])\|/', '|  ${1}|', $fc);

スペース列が 3 つあるため、3 桁の数字 (|XXX|) については何もする必要はありません。

これはうまくいくはずです!

于 2013-01-13T21:46:51.950 に答える