PHP」カテゴリーアーカイブ

正規表現でコメントと改行を消す

Microsoft Teamsを使っているような大企業の要件でコメント行と改行を除いたステップ数がほしいとのこと
gitのコミットIDまでソースを戻して差分を表示して改修した箇所と新規追加のステップ数を出すことに

下記のコメントを全部消す正規表現

^\r\n|^ *|//.*\r\n|/\*.*\r\n|\*.*\r\n

先頭の改行、先頭のスペース、スラスラから改行コードまで、スラアスタから改行コードまで、アスタから改行コードまで

<?php
    // コメント
    $foo = null;
    /* コメント */
    $bar = 0;

    /**
     * コメントを消す
     *
     * @param int $id
     * @return boolean
     *
     */
    public function foo($id, $hoge = true) {
        if ($id == 1) {
            $hoge = false;
        }
        return $hoge;
    }

正規表現でコメントを削除
すべて置換押下

<?php
$foo = null;
$bar = 0;
public function foo($id, $hoge = true) {
if ($id == 1) {
$hoge = false;
}
return $hoge;
}

PHP 時間の差分を求める

日付を除外して時間のみを求める方法がなかったのでまとめ

<?php

$from_h = '8'; // 08でも可
$from_m = '10';
$to_h = '17';
$to_m = '00';

echo sectostr(strtosec($to_h, $to_m) - strtosec($from_h, $from_m));
// 08:50と表示されます

function sectostr($val) {
    return sprintf("%02d:%02d", $val / 3600, ($val % 3600) / 60);
}

function strtosec($h, $m) {
    return $h * 3600 + $m * 60;
}

時間と分を秒に直して差分を出しています。
秒に直すのでstrtotimeやnew DateTimeにて比較しなくてもいいです。
strtotimeとnew DateTimeは日付ありきでの比較になるので時間のみの差分を出すときややこしいです。
下記一例

<?php

echo date('Y/m/d H:i', strtotime('17:00') - strtotime('8:10'));
// 1970/01/01 09:50と表示

strtotimeだと日付の引き算がされ時間のみの差分が出せません。
強引にやるならこう

<?php

echo date('Y/m/d H:i', strtotime('17:00') - strtotime('8:10') + strtotime(date('Y/m/d')));
// 2021/08/14 08:50と表示

引き算された日付を最後に足して日付のつじつまを合わせていますが、このコードは休憩時間を除いたりするときに日付のことを常に考えなくてはならずややこしすぎて使えません。

XAMPP Xdebug3 Eclipse 設定

Xdebugが2から3にアップグレードしていて動かなかったのでまとめ

下記コードがXdebug2のphp.iniの設定

xdebug.remote_enable=1
xdebug.default_enable=0
xdebug.profiler_enable=0
xdebug.auto_trace=0
xdebug.coverage_enable=0

上記コードがXdebug3では使えなくなって、次のように書く

[XDebug]
zend_extension = "C:\xampp\php\ext\php_xdebug-3.0.4-8.0-vs16-x86_64.dll"
xdebug.mode=debug

ポートも9000から9003に変更になってたのでEclipseのデバッグの構成

Xdebug

PHP wkhtmltopdf SnappyでPDF出力

今までTCPDTやmPDFを使ってたのですがHTML5 + CSS3のWebページを丸ごとPDF化する必要がありレイアウトのズレが実装できるレベルじゃなかったのでwkhtmltopdf Snappyを調べました。

環境
Windows10
XAMPP
PHP7.3

require "knp-snappy/vendor/autoload.php";
use Knp\Snappy\Pdf;
$snappy = new Pdf('"C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe"');
// $snappy->setBinary('"C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe"')
$html = <<<EOF
<style></style>
<p>ここにHTMLを書く</p>
EOF;
// PDFをブラウザに出力
//header("Content-Type: application/pdf");
//echo $snappy->getOutputFromHtml($html);
// 保存
$snappy->generateFromHtml($html, 'download.pdf');

はまった点

setBinaryなどでバイナリのパスを渡すときはコマンド扱いになるのでダブルクォーテーションで囲むのを忘れていてはまりました。

TCPDF FPDIでPDFファイル生成

ここではTCPDF、FPDIを使ったPHPでのPDFファイルの生成を解説していきます。

tcpdf

TCPDFのダウンロード
http://sourceforge.net/projects/tcpdf/files/

FPDIのダウンロード
http://www.setasign.de/products/pdf-php-solutions/fpdi/downloads/
FPDIはFPDIとFPDI_TPLの2つダウンロードしてください。
FPDI_TPLのfpdf_tpl.phpはFPDI直下に置いてください。

UTF-8で日本語フォント

TCPDF標準フォントならkozgopromediumになりますが数字がうまく表示されなかったのでIPAフォント、TTFファイルのIPA Pゴシックをダウンロードします。
http://ossipedia.ipa.go.jp/ipafont/ipafont/download.html

サンプルソース

<?php
  
    require_once('./tcpdf/tcpdf.php');
    require_once('./fpdi/fpdi.php');
  
    $pdf = new FPDI();
  
    // 余白設定
    $pdf->SetMargins(0, 0, 0);
    // セルパディング設定
    $pdf->SetCellPadding(0);
    // 自動改ページ
    $pdf->SetAutoPageBreak(false);
  
    // ヘッダ、フッダを使用しない
    $pdf->setPrintHeader(false);
    $pdf->setPrintFooter(false);
  
    // 1ページ目を準備
    $pdf->AddPage();
  
    // フォント設定
    $font = $pdf->addTTFfont('./tcpdf/fonts/ipagp.ttf', 'TrueTypeUnicode', '', 32);
    $pdf->SetFont($font, '', 10);
  
    // PDFファイル読み込み
    $pdf->setSourceFile('./pdf/include.pdf');
    $page = $pdf->importPage(1);
    $pdf->useTemplate($page);
  
    // Text
    $pdf->Text(10, 10, 'こんにちは世界');
  
    // 改行
    $pdf->Ln();
  
    // セル
    $pdf->Cell(70, 10, 'セル', 1, 0, 'L');
  
    $pdf->Ln();
  
    // HTML表記
    $pdf->writeHTML('<h1>html表記</h1>', true, 0, true, 0);
  
    // 画像表示
    $pdf->Image('./image/image.jpg', 10, 10);
  
    // PDF出力
    $pdf->Output('sample.pdf', 'D');

解説

$pdf->SetMargins(0, 0, 0); (9行目)
余白の設定をします。

$pdf->SetCellPadding(0); (11行目)
セルパディングを設定します。

$pdf->SetAutoPageBreak(false); (13行目)
自動改ページするかをtrue or falseで指定してください。

$pdf->setPrintHeader(false); (16、17行目)
ヘッダー、フッダーを使用するかをtrue or falseで指定してください。

$pdf->AddPage(); (20行目)
1ペーシ目を準備します。

$pdf->SetFont($font, ”, 10); (24行目)
フォントサイズを設定します。

$pdf->setSourceFile(‘./pdf/include.pdf’); (27~29行目)
テンプレートになるPDFファイルがあれば読み込んでください。

$pdf->Text(10, 10, ‘こんにちは世界’); (32行目)
x座標、y座標、表示する文字列で指定してください。

$pdf->Ln(); (35行目)
PDF内での改行ができます。

$pdf->Cell(70, 10, ‘セル’, 1, 0, ‘L’); (38行目)
セルの幅、高さ、文字列、枠線で囲むかの指定、出力後のカーソルの移動方法、テキストの整列で指定してください。

$pdf->writeHTML(); (43行目)
出力するHTMLテキスト、改行するかしないか、背景の塗つぶし指定、前回の高さ設定を引き継ぐかで指定してください。

$pdf->Image(‘./image/image.jpg’, 10, 10); (46行目)
画像ファイル、x座標、y座標、幅、高さで指定してください。

$pdf->Output(‘sample.pdf’, ‘D’); (49行目)
I: ブラウザに出力する(既定)、保存時のファイル名が$nameで指定した名前になる。
D: ブラウザで(強制的に)ダウンロードする。
F: ローカルファイルとして保存する。
S: PDFドキュメントの内容を文字列として出力する。

関連記事
TCPDF FPDIでPDF読み込みエラーを解消 setSourceFile
https://office-goto.info/php/tcpdf-fpdi-setsourcefile/