20200520のPHPに関する記事は20件です。

PHP&MySQLでデータの個数を数える方法(PDO)

MySQL接続をした後この処理をします。

$sql_form = "SELECT * FROM テーブル名";
$sql_form_result = $PDO -> query($sql_form);
$form_row_count = $sql_form_result->rowCount();

変数の名前は必要に応じて変えても大丈夫です。
$form_row_countという変数にデータ数が格納されています。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHPでMySQLデータを繰り返し処理(while文)

//データベース接続
$dsn = 'mysql:dbname=データベース名;host=localhost';
$user = 'root';
$password = 'パスワード';
try{
    $PDO = new PDO($dsn, $user, $password);
}catch (PDOException $e){
    print('Error:'.$e->getMessage());
    die();
}

//データの取得
$sql_shop = "SELECT * FROM shopdata";
$sql_shop_result = $PDO -> query($sql_shop);

//同じデータのgenreというフィールドがあった場合ひとつだけ取得する(必要に応じて削除可)
$sql_genre = "SELECT DISTINCT genre FROM shopdata";
$sql_genre_result = $PDO -> query($sql_genre);

//繰り返し処理(連想配列で取得)
while($genre_row = $sql_genre_result->fetch(PDO::FETCH_ASSOC)){
    $genre_rows[] = $genre_row;
  }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHPでデータベースの重複を取得するには

<?php
$query = $dbh->query("SELECT COUNT(*) FROM formdata WHERE userid = '".$userid."' AND kind = '".$kind."'");
$count = $query->fetchColumn();
if ($count > 0){
?>
<p align="center">投稿が重複しています</p>
<?php
}else{
// データの追加
$sql = 'INSERT INTO formdata(id, kind, star, message, userid) VALUES("'.$id.'","'.$kind.'","'.$star.'","'.$message.'","'.$userid.'")';
$stmt = $dbh -> prepare($sql);
$stmt -> execute();
?>
<p align="center">投稿ありがとうございました。</p>

mysqli接続だとfetchColumやprepare関数が使えなくなるのでpdo接続してあります。

2行目は
formdataというテーブルの中に
kindというフィールドがphpの変数kindと同じかつ、useridというフィールドがphpの変数useridと同じデータが
何個あるかカウントしています。

4行目のif文で、カウントした個数が0よりも多かった場合に重複した時の処理を出力します。
(ここではhtmlのテキストを出力)

10行目では、データが重複しなかったので新たなデータをデータベースに追加します。
id, kind, star, message, useridは追加するデータのフィールド名

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

phpでひとつ前のページにリダイレクトする方法

header('Location: '.$_SERVER['HTTP_REFERER']);
exit;

リダイレクトで処理が中断されるのでexit;を書いておきましょう。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHPでひとつ前のページにリダイレクトする方法

header('Location: '.$_SERVER['HTTP_REFERER']);
exit;

リダイレクトで処理が中断されるのでexit;を書いておきましょう。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

phpでmysqlのデータを取得して操作する方法

//データベース接続
$dsn = 'mysql:dbname=テーブル名;host=localhost';
$user = 'root';
$password = 'パスワード';
try{
    $PDO = new PDO($dsn, $user, $password);
}catch (PDOException $e){
    print('Error:'.$e->getMessage());
    die();
}

// データの追加
$sql = 'INSERT INTO formdata(id, kind, star, message, userid) VALUES("'.$id.'","'.$kind.'","'.$star.'","'.$message.'","'.$userid.'")';
$stmt = $dbh -> prepare($sql);
$stmt -> execute();

//データの編集(更新)
$sql = ('UPDATE formdata SET star = :star,message = :message WHERE id = :id');
$stmt = $PDO->prepare($sql);
$params = array(':star' => $star, ':message' => $message, ':id' => $form_id);
$stmt->execute($params);

//データの削除
$sql = ('DELETE FROM formdata where id = :id');
$stmt = $PDO->prepare($sql);
$params = array(':id' => $form_id);
$stmt->execute($params);

formdataにはテーブル名を代入します。
idはprimary keyにしてあります。
star,messageはテーブルのフィールド名です。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

phpでmysqlにpdo接続するには

//データベース接続
$dsn = 'mysql:dbname=データベース名;host=localhost';
$user = 'root';
$password = 'パスワード';
try{
    $PDO = new PDO($dsn, $user, $password);
}catch (PDOException $e){
    print('Error:'.$e->getMessage());
    die();
}

エラーの時はメッセージが表示されるようにしておきます

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Contact Form 7とJavaScriptで特殊なバリデーションをする方法

やりたいこと

contact-form-7で、特殊なバリデーションをして欲しいと言われました。

例えば、言われたこととしては ↓

  • 半角英数字、大文字でかつ10文字の規制をお願いします。
  • これは極端な話、aと入力したら自動でAとなる。と思っていいですよね。

これを実現したい場合、下記のように実装すると出来るようになります。

contents-form7

フォームでは、idを用いて操作します。

[text* coupon-code-2-1 class:secure-key id:Name01]

functions.phpに追加

固定ページで、jQueryを使うために、カスタムJSを使えるようにします。functions.phpの最後にこれを追加してください。

//Custom JS Widget
add_action('admin_menu', 'custom_js_hooks');
add_action('save_post', 'save_custom_js');
add_action('wp_head','insert_custom_js');
function custom_js_hooks() {
    add_meta_box('custom_js', 'Custom JS', 'custom_js_input', 'post', 'normal', 'high');
    add_meta_box('custom_js', 'Custom JS', 'custom_js_input', 'page', 'normal', 'high');
}
function custom_js_input() {
    global $post;
    echo '<input type="hidden" name="custom_js_noncename" id="custom_js_noncename" value="'.wp_create_nonce('custom-js').'" />';
    echo '<textarea name="custom_js" id="custom_js" rows="5" cols="30" style="width:100%;">'.get_post_meta($post->ID,'_custom_js',true).'</textarea>';
}
function save_custom_js($post_id) {
    if (!wp_verify_nonce($_POST['custom_js_noncename'], 'custom-js')) return $post_id;
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return $post_id;
    $custom_js = $_POST['custom_js'];
    update_post_meta($post_id, '_custom_js', $custom_js);
}
function insert_custom_js() {
    if (is_page() || is_single()) {
        if (have_posts()) : while (have_posts()) : the_post();
            echo '<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script><script type="text/javascript">'.get_post_meta(get_the_ID(), '_custom_js', true).'</script>';
        endwhile; endif;
        rewind_posts();
    }
}

カスタムjs

で、最後に、カスタムjsに下記をコピペしてください。

/**
 * 半角英数字かチェック
 * @return true:半角英数字である(もしくは対象文字列がない), false:半角英数字でない
 */
function isHalfWidthAlphanumeric(value) {
  if ( value == null )
    return;
  if( value.match( /[^A-Za-z0-9\s.-]+/ ) ) {
    alert("半角英文字で入力してください");
    return false;
   }
   return true;
}

$(function(){$("#Name01").blur(function(){ if ( !isHalfWidthAlphanumeric($(this).val()) ) { $(this).focus(); } });});
$(function(){$("#Name01").blur(function(){document.getElementById("Name01").value=$(this).val().toUpperCase();});});
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

LaravelでIntervention Imageを利用して画像のサイズ(容量)を下げる方法

利用シーン

Laravelで開発をしていて、サーバーに画像を沢山アップすることが想定されるとき。

背景

Intervention ImageはPHPで扱える画像処理のライブラリ。
blurをかけたり、縦横幅をリサイズしたり、回転させたりと多岐にわたる機能を実現している。
http://image.intervention.io/

しかし, 画像の容量を1MB未満に抑えたい、という要求に対してストレートに応えてくれる機能はない。(もし見つけたらご教示ください)

他のライブラリを探すのも面倒なので、機能を組み合わせて自分で作ってしまえばいいやということで関数を作ってみました。

コード

    /**
     * @param  UploadedFile $img_file   画像ファイル(*今回はUploadedFileを利用)
     * @param  string       $path       画像の保存パス
     * @param  int          $quality    画像の解像度の初期設定
     * @param  int          $size       ここまで下げたいという画像サイズの値
     */
    public function compressImage(UploadedFile $img_file, string $path, int $quality, $size)
    {
        $image = Image::make($img_file);
        $image->save($path, $quality);

        // クオリティを下げた後のファイルサイズが十分下がっていなければもう一度関数を呼び出す
        $image = Image::make($path);
        if($image->filesize() > $size){
            $quality -= 5;
            return $this->compressImage($img_file, $path, $quality, $size);
        }
    }

解説

$image = Image::make($img_file);
$image->save($path, $quality);

画像ファイルを読み込み、save()メソッドで任意の解像度に下げて保存。
*ドキュメントにはデフォルトで90と書いてありますが80未満で設定しておくと吉。
http://image.intervention.io/api/save

$image = Image::make($path);
if($image->filesize() > $size){
     $quality -= 5;
     return $this->compressImage($img_file, $path, $quality, $size);
}

保存した画像を改めて読み込み、
filesize()メソッドで画像のファイル容量を確認。
ファイル容量が設定したサイズ(1MBなら1024000を入力)よりも大きければ、
解像度を5低く設定してもう一度同じ関数を再帰的に呼び出す。

使い方

この関数をヘルパ関数として登録して

hoge.php
$file = $request->file('img');
$path = "your/path";
$quality = 80;
$size = 1024000;

$resized_img = compressImage($file, $path, $quality, $size);

とすれば使えます。

終わりに

もし他に良い方法や改善できる箇所がありましたらご教示ください。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Touch Barにタスク管理ツールのタスクを自動表示させる【PHP×GoogleCalendarAPI】

最近MacBookAir13インチを卒業し、MacBookPro16インチを購入したのですが、こいつはすごいですね。

TouchBarとかいう近未来的なディスプレイ(壮大なおもちゃ)がついています。

ここにスクリプトを書いて何か面白いことしたい(有効活用したい)と誰しも一度は思うのではないでしょうか。

私はこの記事以前に「YouTubeの登録者数と再生数を表示させたい!」と以前考え実装したのですが、

IMG_7235 (1).JPG

これだけでは満足できず、今度は

今現在時刻のタスクを表示させたい!!と考えました。

本記事のゴール

タスク管理ツールに予定を入れたら、あとはTouchBarに自動で現在時刻のタスクが出てくる

完成像

こんな感じになりました。

スクリーンショット 2020-05-20 17.36.32.png

IMG_7252.JPG

高度な生産性はシングルタスクができるかにかかっています。

マルチタスクになって何も為せない日々が続いていませんか?

タスクを1つだけ表示させることで、目の前の作業に集中できるのです。

仕様紹介

今回タスク管理ツールには、APIが充実しているGoogleカレンダーを採用しました。

基本的な流れ

  • まずはGoogleカレンダーにタスク登録
  • 次にGoogleCalendarAPIに登録し、PHPでイベント取得
  • Better Touch Toolでphpコマンドで発火

という手順を踏みます。

前提条件、環境

OS:macOS Catalina
バージョン:PHP 7.3.12
Composer1.9.0
Better Touch Tool導入済

①下準備

まずはGoogleCalendarAPI及びサービスアカウントとの紐付け、権限周りを以下の記事で行ってください。

Google Calendar API と PHP で 予定の取得と追加をしてみるよ(準備編)

ついでにまだカレンダーで予定作ってない方は予定を組んでおいてください。

②Composerで必要なものをインストール

A PHP client library for accessing Google APIs
https://github.com/googleapis/google-api-php-client

githubより.zip形式でダウンロードしインストールもできますが、今回はcomposerでインストールします。
composerない方はgithubよりダウンロードもOKですが、composer便利なのでこの機会に導入しましょう。

Composerをインストールしてみた

cdコマンドで作業ディレクトリに移動したのちに(今回はcalendarディレクトリとしました。どこに作成してもいいです。)
composerコマンドを実行します。

$ composer require google/apiclient:^2.0

いろいろなファイルが作成され以下のようなディレクトリになります。

calendar/
 ├ comoser.json(composerで自動作成される)
 ├ composer.lock(自動作成)
 ├ Googleサービスアカウント秘密鍵.json(下準備時にDLしてるはず)
 ├ vendor/
 │   └ outoload.php他(自動作成)
 └ calendar.php(今回の処理書く作業ファイル、まだ空でいい)

サービスアカウント作成時にできた秘密鍵のjsonをここに移動させ、calendar.phpは空でいいので作成しておいてください。

スクリーンショット 2020-05-20 17.58.34.png
スクリーンショット 2020-05-20 17.58.42.png

③PHPでデータ取得、表示

先ほど作成したcalendar.phpに記述します。

<?php

// composerでインストールしたライブラリを読み込む
require_once __DIR__ . '/vendor/autoload.php';

// サービスアカウント作成時にダウンロードしたjsonファイル
$aimJsonPath = __DIR__ . '/あなたの秘密鍵.json';

// サービスオブジェクトを作成
$client = new Google_Client();

// アプリケーション名
$client->setApplicationName('Touch Bar Display ToDos');

// 予定を取得するだけなので、Google_Service_Calendar::CALENDAR_READONLY
$client->setScopes(Google_Service_Calendar::CALENDAR_READONLY);

// ユーザーアカウントのjsonを指定
$client->setAuthConfig($aimJsonPath);

// サービスオブジェクトの用意
$service = new Google_Service_Calendar($client);

// カレンダーIDは後述
$calendarId = 'xxxxxxxxxxxxxxxxx';
// 開始日時
$start = date('c');
// 終了日時(1分後)
$end = date('c', strtotime("+1 minute"));
// 取得時の詳細設定 $startから1分後を$endとすることで、取得範囲を現在時刻のようにしている
$option = [
  'timeMin' => $start,
  'timeMax' => $end,
  'singleEvents' => 'true'
];
// データの取得
$response = $service->events->listEvents($calendarId, $option);
$events = $response->getItems();

$results = [];
if (!empty($events)) {
  foreach ($events as $event) {

    $start = new DateTime($event->start->dateTime);
    $end = new DateTime($event->end->dateTime);
    $results = [
      'start' => $start->format('H:i'),
      'end' => $end->format('H:i'),
      'title' => (string) $event->summary
    ];
  }
  echo $results['start'] . "〜";
  echo $results['end'] . "\n";
  echo $results['title'];
} else {
//カレンダーにタスクがない場合のメッセージ。自由に改変してください。
  echo 'no task';
}

optionはリファレンス参照してみてください。

Google Calendar API REST Reference

カレンダーIDはどこから?

カレンダー左の「設定と共有」から

スクリーンショット 2020-05-20 17.19.36.png

スクリーンショット 2020-05-20 17.26.08.png

「カレンダーの統合」を見つければIDがわかります。

Better Touch Toolはechoしたものをretutnして表示できる

最後に取得した値をechoしているのは、Better Touch Toolが取得できるようにするためです。

④Better Touch Toolから発火させる

まずはBetter Touch Toolを開き、以下の画面のように追加します。

スクリーンショット 2020-05-20 17.49.04.png
そしたら右側にこのような画面が出てきます。

スクリーンショット 2020-05-20 17.53.57.png

ここからphpファイルを実行していきます。

手順としては

①cdコマンドでphp実行ファイルが入っているディレクトリまで移動して、
②phpコマンドを叩きphpファイルを実行する

でいけます。

デスクトップにディレクトリを作られられた方はこんなコードになるかなと(return do shell scriptは必ず必要になります)

return do shell script "cd /Users/ここは人によって違う名前/Desktop/calendar/ ; php calendar.php"

スクリーンショット 2020-05-20 18.20.34.png

その後スクリプトを実行を押し、画像のようにスクリプト結果にタスクが出力されたら、完了になります。

同時に各スクリプトの実行タイミングがデフォルトでは5secondsとなっており、これではすぐにAPIアクセス制限がかかるので、300secondsあたりに変更しておきます(ただ数分タスク更新がズレるので値はお好みで)

これにてtouch Barに表示されているはずです。

このままだと文字サイズが大きいのでptをいじり調整。

スクリーンショット 2020-05-20 20.44.08.png

IMG_7252.JPG

表示できたら、脱マルチタスクへの第一歩だ

おまけ
スクリーンショット 2020-05-21 20.11.40.png

IMG_7260.JPG

タスクがない場合はelse部分のメッセージが表示されます。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MacBookのTouch BarにGoogleカレンダーの現在時間のタスクを表示させる【GoogleCalendarAPI】

最近MacBookAir13インチを卒業し、MacBookPro16インチを購入したのですが、こいつはすごいですね。

TouchBarとかいう近未来的なディスプレイ(壮大なおもちゃ)がついています。

ここにスクリプトを書いて何か面白いことしたい(有効活用したい)と誰しも一度は思うのではないでしょうか。

私はこの記事以前に「YouTubeの登録者数と再生数を表示させたい!」と以前考え実装したのですが、

IMG_7235 (1).JPG

これだけでは満足できず、今度は

今現在時刻のタスクを表示させたい!!と考えました。ごく自然な欲求かと思います。

本記事のゴール

タスク管理ツールに予定を入れたら、あとはTouchBarに自動で現在時刻のタスクが出てくる

完成像

こんな感じになりました。

スクリーンショット 2020-05-20 17.36.32.png

IMG_7252.JPG

高度な生産性はシングルタスクができるかにかかっています。

マルチタスクになって何も為せない日々が続いていませんか?

タスクを1つだけ表示させることで、目の前の作業に集中できるのです。

仕様紹介

今回タスク管理ツールには、APIが充実しているGoogleカレンダーを採用しました。

基本的な流れ

  • まずはGoogleカレンダーにタスク登録
  • 次にGoogleCalendarAPIに登録し、PHPでイベント取得
  • Better Touch Toolでphpコマンドで発火

という手順を踏みます。

前提条件、環境

OS:macOS Catalina
バージョン:PHP 7.3.12
Composer1.9.0
Better Touch Tool導入済

①下準備

まずはGoogleCalendarAPI及びサービスアカウントとの紐付け、権限周りを以下の記事で行ってください。

Google Calendar API と PHP で 予定の取得と追加をしてみるよ(準備編)

ついでにまだカレンダーで予定作ってない方は予定を組んでおいてください。

②Composerで必要なものをインストール

A PHP client library for accessing Google APIs
https://github.com/googleapis/google-api-php-client

githubより.zip形式でダウンロードしインストールもできますが、今回はcomposerでインストールします。
composerない方はgithubよりダウンロードもOKですが、composer便利なのでこの機会に導入しましょう。

Composerをインストールしてみた

cdコマンドで作業ディレクトリに移動したのちに(今回はcalendarディレクトリとしました。どこに作成してもいいです。)

$ composer require google/apiclient:^2.0

いろいろなファイルが作成され以下のようなディレクトリになります。

calendar/
 ├ comoser.json(composerで自動作成される)
 ├ composer.lock(自動作成)
 ├ Googleサービスアカウント秘密鍵.json(下準備時にDLしてるはず)
 ├ vendor/
 │   └ outoload.php他(自動作成)
 └ calemdar.php(今回の処理書く作業ファイル、まだ空でいい)

サービスアカウント作成時にできた秘密鍵のjsonをここに移動させ、calendar.phpは空でいいので作成しておいてください。

スクリーンショット 2020-05-20 17.58.34.png
スクリーンショット 2020-05-20 17.58.42.png

③PHPでデータ取得、表示

先ほど作成したcalendar.phpに記述します。

<?php

// composerでインストールしたライブラリを読み込む
require_once __DIR__ . '/vendor/autoload.php';

// サービスアカウント作成時にダウンロードしたjsonファイル
$aimJsonPath = __DIR__ . '/あなたの秘密鍵.json';

// サービスオブジェクトを作成
$client = new Google_Client();

// アプリケーション名
$client->setApplicationName('Touch Bar Display ToDos');

// 予定を取得するだけなので、Google_Service_Calendar::CALENDAR_READONLY
$client->setScopes(Google_Service_Calendar::CALENDAR_READONLY);

// ユーザーアカウントのjsonを指定
$client->setAuthConfig($aimJsonPath);

// サービスオブジェクトの用意
$service = new Google_Service_Calendar($client);

// カレンダーIDは後述
$calendarId = 'xxxxxxxxxxxxxxxxx';
// 開始日時
$start = date('c');
// 終了日時(1分後)
$end = date('c', strtotime("+1 minute"));
// 取得時の詳細設定 $startから1分後を$endとすることで、取得範囲を現在時刻のようにしている
$option = [
  'timeMin' => $start,
  'timeMax' => $end,
  'singleEvents' => 'true'
];
// データの取得
$response = $service->events->listEvents($calendarId, $option);
$events = $response->getItems();

$results = [];
if (!empty($events)) {
  foreach ($events as $event) {

    $start = new DateTime($event->start->dateTime);
    $end = new DateTime($event->end->dateTime);
    $results = [
      'start' => $start->format('H:i'),
      'end' => $end->format('H:i'),
      'title' => (string) $event->summary
    ];
  }
}
echo $results['start'] . "〜";
echo $results['end'] . "\n";
echo $results['title'];;

optionはリファレンス参照してみてください。

Google Calendar API REST Reference

カレンダーIDはどこから?

カレンダー左の「設定と共有」から

スクリーンショット 2020-05-20 17.19.36.png

スクリーンショット 2020-05-20 17.26.08.png

「カレンダーの統合」を見つければIDがわかります。

Better Touch Toolはechoしたものをretutnして表示できる

最後に取得した値をechoしているのは、Better Touch Toolが取得できるようにするためです。

④Better Touch Toolから発火させる

まずはBetter Touch Toolを開き、以下の画面のように追加します。

スクリーンショット 2020-05-20 17.49.04.png
そしたら右側にこのような画面が出てきます。

スクリーンショット 2020-05-20 17.53.57.png

ここからphpファイルを実行していきます。

手順としては

①cdコマンドでphp実行ファイルが入っているディレクトリまで移動して、
②phpコマンドを叩きphpファイルを実行する

でいけます。

デスクトップにディレクトリを作られられた方はこんなコードになるかなと(return do shell scriptは必ず必要になります)

return do shell script "cd /Users/ここは人によって違う名前/Desktop/calendar/ ; php calendar.php"

スクリーンショット 2020-05-20 18.20.34.png

その後スクリプトを実行を押し、画像のようにスクリプト結果にタスクが出力されたら、完了になります。

同時に各スクリプトの実行タイミングがデフォルトでは5secondsとなっており、これではすぐにAPIアクセス制限がかかるので、300secondsあたりに変更しておきます(ただ数分タスク更新がズレるので値はお好みで)

これにてtouch Barに表示されているはずです。

このままだと文字サイズが大きいのでptをいじり調整。

スクリーンショット 2020-05-20 20.44.08.png

IMG_7252.JPG

表示できたら、脱マルチタスクへの第一歩だ

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Wordpressでphpのデバッグをしたい

wp-config.confのWP_DEBUGtrueに変更して以下を追加する。

wp-config.conf
define( 'WP_DEBUG', true );
if ( WP_DEBUG ) {
    define( 'WP_DEBUG_LOG', true );
    define( 'WP_DEBUG_DISPLAY', false );
    @ini_set( 'display_errors', 0 );    
}

あとは適当なphpファイルでerror_log()を使って出力する。

functions.php
error_log('this is debug.');

wp-content以下にdebug.logが出力されるので確認できる。

debug.log
[20-May-2020 00:00:00 UTC] this is debug.
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHP初心者がMacでLaravelに挑む

(試験的に勉強兼ねて英語で書いてみた)

Goal

  • To learn from the environment setup to the fundamental usage
  • To create a To-do app with Laravel

Environment setup

0. Development environment

Mac OS Catalina 10.15.4
MacBook Air (13-inch, Mid 2013)

1. Downloading & Installing

1.1. Choosing the version

Laravel 7 (the latest version as of May 2020)
PHP 7.3.11 (Laravel 7 requires above 7.2.5)

1.2. Installing composer

Composer
laravel1.png

Access the above website and click Download

laravel2.png

Execute these four lines on this webpage like:

$ php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
$ php -r "if (hash_file('sha384', 'composer-setup.php') === 'e0012edf3e80b6978849f5eff0d4b4e4c79ff1609dd1e613307e16318854d24ae64f26d17af3ef0bf7cfb710ca74755a') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
$ php composer-setup.php
$ php -r "unlink('composer-setup.php');"

They mean that in order:

・ Download the installer to the current directory
・ Verify the installer SHA-384
・ Run the installer
・ Remove the installer

Move Composer

$ mv composer.phar /usr/local/bin/composer

Check if it succeeded

$ composer -V
Composer version 1.10.6 2020-05-06 10:28:10

1.3. Installing Laravel

Create a project called sample, or what else you like.

$ composer create-project --prefer-dist laravel/laravel sample

1.4. Starting a server

Move into the directory you made and start a server.

$ cd sample
$ php artisan serve

Try to access your local server: http://localhost:8000 on a web browser!
laravel3.png

Congratulations!!

Creating a ToDo app

Now I start to create a ToDo app known as that is simple and easy to develop for even a beginner.
I referred to this website:
Laravelの知識ゼロから基本をマスターするチュートリアル | Awesome Blog

References

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

WordPress で、Snow Monkey Blocks のブロックを初期配置する

WordPressには、新規投稿にあらかじめブロックを初期配置しておく機能があります。

新規投稿時にブロック配置

(初期配置について詳しくは、WordPressユーザーのためのPHP入門 はじめから、ていねいに。第3版 p229-231を参照してください)

この機能は、WordPressのデフォルトで用意されているブロックだけでなく、テーマやプラグインの独自ブロックにも適用できます。

アコーディオンブロックを置いてみる

試しに、Snow Monkey Blocks のアコーディオンブロックを置いてみました。

newpost.png

置いたブロックは、
1. 見出しブロック - 「あらすじ」という文字列を初期設定する
2. 段落ブロック
3. アコーディオンブロック - 「ネタバレ」という文字列を初期設定する

です。見出しと段落はWP標準のブロックで、アコーディオンは Snow Monkey Blocks です。

コード例

書いたコードは以下のようになります。

$post_type_object->template = [
        [
            'core/heading',
            [
                'level'   => '2',
                'content' => 'あらすじ'
            ]
        ],
        [
            'core/paragraph',
            [
            ]
        ],
        [
            'snow-monkey-blocks/accordion--item',
            [
                'title'   => 'ネタバレ',
            ]
        ],
]

フックなどの詳細はWordPressユーザーのためのPHP入門 はじめから、ていねいに。第3版 でご確認ください。

ブロック名はどうやって調べる?

↑のコードでは、core/heading 等の名前で、ブロックを指定しています。ではこのブロックの名前はどうやって調べたらよいでしょうか?

WordPressのデフォルトのブロックは、WordPressのデフォルトのブロック一覧ページで名前を確認できます。

テーマ・プラグインの場合は、作者のウェブサイトやソースコードなどで確認します。Snow Monkey Blocksの場合は、ソースコードを読んでいくと https://github.com/inc2734/snow-monkey-blocks/blob/master/block/accordion/block/item/index.js#L11 snow-monkey-blocks/accordion--item という名前であることが分かります。
また属性は https://github.com/inc2734/snow-monkey-blocks/blob/master/block/accordion/block/item/attributes.json を見ると titleinitialState が設定できることが分かります。

複数人で記事を書くときに便利

ブロックを初期配置する機能を使うと、複数人で記事を書くときに便利です。ブックレコメンド では、寄稿者に下書きを作成してもらうことがあるのですが、そのようなときに便利です。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Windows10 に PHP7+Laravel環境をDockerで構築

概要

掲題のとおり「Windows10 に PHP7+Laravel環境をDockerで構築」を、
↓こちらの神記事を参考に、初心者向けに解説していきます。

最強のLaravel開発環境をDockerを使って構築する【新編集版】

「どうしてそういう設定を施すのか?」といったことは元記事が丁寧に説明して下さっているので、ここではとにかくローカルPC内にLaravelサーバを立ち上げるまでの手続きを駆け足でご紹介すると共に、Windows10でやると行きづまる所を補足しています。

私が試した環境

  • Windows10 Pro 64bit版
  • Docker Desktop for Windows - 2.3.0.2 (今回の手順中でインストールします)
  • Git for Windows - 2.25.0.windows.1 (今回の手順中でインストールします)
  • Make for Windows - 3.81 (今回の手順中でインストールします)

下準備編

いくつかのソフトウェアが必要なので、ダウンロード&インストールしましょう。

Docker, docker-compose(Docker Desktop for Windows)

↓こちらをご参考に。

Windows 10 に Docker Desktop for Windows をインストールする

※ ↑の記事内に記載していますが、Windows10のエディションやパソコンのCPUによる条件がありますので、ご注意下さい。

Git, Git-Bash(Git for Windows)

↓こちらからダウンロードしてインストールしましょう。
https://gitforwindows.org/

Git for Windows を入れれば Git-Bash も一緒に入ります。

make for Windows

元記事ではmakeコマンドを使用されているので必要です。
(複雑なコマンドをショートカットのようにまとめるのに使用されています。)

↓こちらからダウンロードしてインストールしましょう。
http://gnuwin32.sourceforge.net/packages/make.htm

makeコマンドがあるフォルダを環境変数PATHに追加しておく。

どこからでもmakeコマンドを打てるようにしておきましょう。
手順は割愛しますが、代わりに↓こちらの記事を紹介させていただきます。

Windows で環境変数 PATH をいじる方法のまとめ

makeコマンドがあるフォルダの場所は、デフォルトのインストール設定では↓です。

C:\Program Files (x86)\GnuWin32\bin

make for Windows をインストールするときにインストール先フォルダをカスタマイズした場合は、↑を参考に探してみてください。

一部コマンドをwinpty経由で実行するよう設定する。

Gitインストール時、オプションUse MinTTYをONにした場合、この設定作業が必要です。

  1. Windowsにログオンしているユーザーのホームフォルダ(例: C:\Users\山田太郎)の中に.bashrcという名前のテキストファイルを作ります。(すでに存在する場合は不要です。)
  2. .bashrcの中身に↓を追記して保存します。
alias docker='winpty docker'
alias docker-compose='winpty docker-compose'
alias make='winpty make'

Git-Bashに慣れている方は、vimコマンドなどで作業してももちろんOKです!

※ winptyは、Windowsへのコマンド指示をLinuxっぽいインターフェースでできるようにするラッパー的なソフトです。
ここでは、dockerdocker-composemakeコマンドだけ、自動的にwinpty経由で実行するよう設定をしています。
これをしないと、dockerコンテナの中に入って作業する系のコマンドが↓のようなエラーで失敗します。

$ docker-compose exec app composer create-project --prefer-dist laravel/laravel .
the input device is not a TTY.  If you are using mintty, try prefixing the command with 'winpty'

またmakeの中で実行されるコマンドもwinpty経由で実行させるにはmake自体をwinpty経由で実行しなければダメなので、3行目でそのように設定しています。

構築編

こちらは駆け足でザッと参ります。
一通り完了したら、ぜひ元記事も読んでみてください。

Git-Bashを起動する。

image.png

適当なフォルダを作って移動する。

ソースコードをダウンロードして色々やるので、万が一汚れても大丈夫なフォルダを作ってそこで作業しましょう。
ここでは例として、Cドライブ直下にtempというフォルダを作ってそこに移動してます。

cd /c
mkdir temp
cd temp

元記事で公開されているソースコード一式をダウンロードする。

githubに公開されているので、gitコマンドを使ってダウンロードします。

git clone git://github.com/ucan-lab/docker-laravel.git

githubアカウントを持ってなくてもダウンロードできるはず…
もし途中でkeyがうんたらと英語で質問が表示されたら、yesと入力してリターンキー押しておけばOK!

makeコマンド向け設定ファイルが存在するフォルダに移動する。

cd docker-laravel/infrastructure

LaravelサンプルWEBサイトを新規作成するコマンドを実行する。

make create-project

数分かかるかも。
ずらーっと流れるログが↓のようになって止まったらOK。

・
・
・
Discovered Package: laravel/tinker
Discovered Package: nesbot/carbon
Discovered Package: nunomaduro/collision
Package manifest generated successfully.
32 packages you are using are looking for funding.
Use the `composer fund` command to find out more!

XXXXXX@XXXXX MINGW64 /c/temp/docker-laravel/infrastructure
$

LaravelサンプルWEBサイトにアクセスしてみる。

↓をWEBブラウザで開いてみてください。
http://127.0.0.1

↓こういうWEBページが表示されたら、成功!
image.png

これはLaravelフレームワークを使って作られているサンプルWEBページで、それを動かすためのWEBサーバが自分のPC内で起動している証です。

お疲れ様でした。

:thumbsup::thumbsup::thumbsup:

この記事では端折った部分もあるので、ぜひ元記事も一読してみてください。

最強のLaravel開発環境をDockerを使って構築する【新編集版】

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHPer脳の人がJavaScriptでarray_sumをする

前提

例えば、レジみたいなプログラム組むときにこんな感じの連想配列にぶち当たることがあるかと思います。

品名(name) 金額(price)
ナナチ 100
ストロングゼロ 118

で、こいつの総額の計算を出したいって思うことがあると思うんですよ。
これくらいなら暗算とか言わないでプログラムで計算してくださいね。

PHPで書く

PHPだとこんな感じに書けると思います。

$items = [
    ['name' => 'ナナチ', 'price' => 100],
    ['name' => 'ストロングゼロ', 'price' => 118],
];

$sub_total = array_sum(array_map(function($i){
    return $i['price'];
}, $items));

echo $sub_total; // 218

この array_sum() という関数は「引数にとった配列の合計値を出す」ってやつなのです。
便利ですよね。
https://www.php.net/manual/ja/function.array-sum.php

JavaScriptで書く

んで、JavaScriptなんですけど、 array_sum() 相当のものはないです。
その代わり Array.prototype.reduce() というのを使います。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce

ってなわけでこんな感じになります。

const items = [
    {'name': 'ナナチ', 'price': 100},
    {'name': 'ストロングゼロ', 'price': 118},
];

const subTotal = items.reduce((accumulator, currentValue) => {
    return accumulator + currentValue.price;
});

console.log(subTotal); // 218

参考に

PHPにも array_reduce() はあります。
https://www.php.net/manual/ja/function.array-reduce.php

さっきのを array_reduce() で書くとこんな感じですかね?

$items = [
    ['name' => 'ナナチ', 'price' => 100],
    ['name' => 'ストロングゼロ', 'price' => 118],
];

$sub_total = array_reduce($items, function($carry, $item){
    return $carry + $item['price'];
});

echo $sub_total; // 218

意外とスッキリ書けるもんですね。array_mapするくらいならこっちでもいいのかも。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

cactiでトラフィックとかリソースのグラフをカレンダー形式で表示させるプラグインを作成したので、簡単なプラグインの作り方をまとめました

はじめに

使ってますか、cacti。いまいち人気ないような気がするんですよね。さみしい。
私はいまだにcactiから離れられませんので、プラグインを作ってみました。

https://github.com/bashaway/rrdcalendar
Screenshot from Gyazo

cactiでのプラグインの作り方を簡単にまとめましたので、なんか作りたい、という方の参考になれば幸いです。

対象機器および環境

  • cacti (1.2.11)

プラグインの作り方

公式マニュアル

公式マニュアル は、ところどころ古いバージョンの記載もあるので、動作に必要な最低限の部分だけ抽出してみます。

ファイル構成

公式マニュアル

ツリー構造

以下のようなツリー構造が推奨されています。
プラグインを収容するディレクトリが、プラグイン名として認識されます。以下の例だと myplugin がプラグインの名称になります。

myplugin/
    docs/
        CHANGELOG
    images/
        myimage.png
        index.php
    lib/
        index.php
        function2s.php
    include/
        index.php
        settings.php
    INFO
    LICENSE
    README.md
    index.php
    setup.php

お作法もありますが、「動作させる」ためには以下のものが必須です。

内容 ファイル名 必須?
docs/ ドキュメント類
images/ 画像類
lib/ 自作ライブラリ ディレクトリの
直下でもOK
include/ 自作スクリプト群 ディレクトリの
直下でもOK
INFO プラグイン定義 必須
LICENSE ライセンス
README.md マニュアル
index.php マッピング用php 必須
setup.php インストール用php 必須

プラグイン定義

公式マニュアル
INFOファイルのことです

プラグインの情報を持ち、以下の画面で表示させるときに利用されます。
Screenshot from Gyazo
また、バージョン相違や依存プラグインの有無などで、インストールできなくさせることができます。(歯車に黄色のビックリマークはインストールできない)

以下のようなファイル形式です。

INFO
[info]
name = プラグイン名(ディレクトリ名と一致していなければいけません)
version = プラグインのバージョン(Versionに対応)
longname = プラグインの説明(PluginDescriptionに対応)
author = プラグイン作成者(Authorに対応)
email = メールアドレス
homepage = プラグインの公開元(PluginNameのリンク先に対応)
compat = 利用可能なcactiバージョンの最小値
requires = このプラグインが必要とするプラグイン名(Requiresに対応)
capabilities = (すいませんよくわかりません)

プラグイン名=ディレクトリ名=INFOに記載されたname である必要があります。
これが一致していないと、以下のように、歯車にビックリマークが付き、インストールできません。
これは、cycle というプラグインのディレクトリ名を cycle_check に変更したときの表示です。
Screenshot from Gyazo

また、INFOファイルのrequiresに記載があり、そのプラグインがインストールされていないと、歯車にビックリマークが付き、インストールできません。
例えば、monitorというプラグインはtholdの1.2.1が必要で、INFOには以下のような記載があります。

monitor/INFO
[info]
(~省略~)
requires = thold:1.2.1
(~省略~)

tholdがインストールされていない場合、プラグイン一覧では以下のような表示になっています。
Screenshot from Gyazo

マッピング用php

公式マニュアル
index.phpのことです。
以下のファイルでOKだそうです。

index.php
<?php
header("Location:../index.php");
?>

インストール用php

公式マニュアル
setup.phpのことです。
以下の関数が必ず含まれている必要があります。

plugin_プラグイン名_install()
plugin_プラグイン名_uninstall()
plugin_プラグイン名_check_config()
plugin_プラグイン名_upgrade()
plugin_プラグイン名_version()

今回作成したプラグインで利用した関数も含めて、必要な関数を紹介します。

setup.php
<?php

# インストールのアイコンがクリックされると、この関数が呼び出されます
# ここでインストール時に必要な設定を行います。
plugin_プラグイン名_install(){

  # cactiのweb画面にタブを表示させたい場合は、第二引数に"top_header_tabs"を持たせたフック関数を呼び出します。
  # 今回はタブの表示が不要なので、必要ありません。
  api_plugin_register_hook('プラグイン名', 'top_header_tabs', 'プラグイン名_show_tab', 'setup.php');

  # 今回作成したプラグインは、グラフの横のアイコンにプラグイン起動用のアイコンを配置しているため、以下の関数を呼び出します。
  api_plugin_register_hook('プラグイン名', 'graph_buttons',            'プラグイン名_graph_buttons',    "setup.php");
  api_plugin_register_hook('プラグイン名', 'graph_buttons_thumbnails', 'プラグイン名_graph_buttons',    "setup.php");

  # このプラグインで呼び出し可能なスクリプトを記載します。
  # これは Console -> Configuration -> Users -> 各ユーザ -> Permissionsタブの画面の下のほうにある
  # Plugin Permissions のON/OFFを設定可能にします。デフォルト設定で0もしくは1で設定します。
  # つまり、ユーザごとにこのプラグインを利用させるかどうか、を設定することができるようになります。
  api_plugin_register_realm('プラグイン名', '利用可能なスクリプト名', 'パーミッション設定画面での表示名', {0|1});

  # インストール時にテーブル作成などが必要な場合は、このあたりに記載します。
  plugin_プラグイン名_なんちゃら関数();
}


# プラグインのアンインストール関数がクリックされると、この関数が呼び出されます
# ここでアンインストール時に必要な設定を行います。
plugin_プラグイン名_uninstall(){
  # アンインストール時にテーブル削除などが必要な場合は、このあたりに記載します。
  plugin_プラグイン名_なんちゃら関数();
}

# プラグインのインストール後に有効化させることができるかどうかの処理をここにいれます。
# でも、インストールさせて有効化させない、という利用シーンが思いつかないので、
# インストール時点でそういうチェックをしてもいいんじゃないか、と思います。
plugin_プラグイン名_check_config(){
  # 有効化用のチェック処理を入れたいときはこのあたりに記載します。
  if(read_config_option('プラグイン名_settings') != '') {
    # 有効化してもいい場合は true を返します。
    return true;
  }
  # 有効化させたくない場合は false を返します。
  return false;
}

# マニュアルに記載がありません。。。(涙)
# たぶん、cactiのアップグレードする際にプラグイン用のデータ変更などを行うためなような気がします。
function plugin_プラグイン名_upgrade(){
}

# プラグインのインストールのためのバージョン確認のために利用されます。
# よくわからないので、このままの記載にしておきます。
plugin_プラグイン名_version(){
  global $config;
  $info = parse_ini_file($config['base_path'] . '/plugins/プラグイン名/INFO', true);
  return $info['info'];
}

# 今回のプラグインは、グラフ表示の際にグラフ横にボタンを配置し、
# そのアイコンががクリックされると、プラグインのスクリプトが呼び出されます(=ここの処理が呼び出されます。)
function プラグイン名_graph_buttons($args) {
  global $config;
  $local_graph_id = $args[1]['local_graph_id'];
  if (api_user_realm_auth("register_realmで設定した利用可能なスクリプト名")) {
    # 閲覧しているユーザにこのプラグインの利用が許可されていれば、スクリプト起動用のアイコンを表示させ
    # それをクリックすれば、別の窓で表示用のスクリプトが起動される、ということです。
    echo "<a href='#' ";
    echo "onclick=\"window.open('".$config['url_path']."plugins/プラグイン名/スクリプト名.php?local_graph_id=".$local_graph_id."', 'popup_".$local_graph_id;
    echo "', 'toolbar=no,menubar=no,location=no,scrollbars=no,status=no,titlebar=no,width=800,height=1100,resizable=yes')\">";
    echo "<img src='".$config['url_path']."plugins/プラグイン名/アイコンファイル名.png' border='0' alt='rrdcalendar' title='calendar' style='padding: 3px;'>";
    echo "</a><br/>";
  }
}

?>

タブの表示とは、画面上部のこんな部分のことです。
Screenshot from Gyazo

api_plugin_register_realmで呼び出す引数は、以下の画面で使われます。
この一番下にある、 Plugin Permissions という記載の部分です。
Screenshot from Gyazo

グラフ横のボタンはこんな感じのものです。
Screenshot from Gyazo

スクリプト本体php

今回作成したスクリプトは、指定したグラフをカレンダー形式で表示させる、というものです。
cactiの本体側の関数で、rrdtool_function_graphというのがあり、個別のグラフのRRDtool呼び出しコマンドを引っ張ってきてくれます。

こんな画面で使われているやつです。
Screenshot from Gyazo

このコマンドラインを横取りして、convertでいんぐりもんぐりして、カレンダー形式に結合しているだけです。
本体の機能におんぶにだっこ状態です。

プラグイン作成とは直接関係ないので、内容は コード参照 でお願いします。

公式プラグインの活用

https://github.com/Cacti/ には、公式プラグインがたくさんあるので、コピーしたものを自分用に作り替えて。。。みたいに習得するのが近道なのかもしれません。でも、公式プラグインとはいえ、マニュアルに記載されてない書き方も多々あるので、注意が必要です。過去の遺産を引きずっているように見える部分もあったりして、「ここ必要?」な箇所も多いです。自分で作っていても、なんでその処理が必要なのかよく理解できていない部分もあります。

さいごに

グラフはカレンダーで見れるとうれしいと思うのですが、あまり需要はないのでしょうか。
他のトラフィック管理ツールでも見かけないです。
ニヤニヤできるのに。

出典

https://github.com/Cacti/documentation#plugin-development
https://github.com/bashaway/rrdcalendar

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

明日から無職でエンジニア目指す

エンジニア転職失敗したらきのこ掘る

自己紹介

■年齢
24歳
■経歴
大学(2019年3月卒業)

プログラミングスクールでキャリアアドバイザー担当(2019年4月〜2020年5月)

■Qiitaを始めた経緯
素人がエンジニアを目指した過程の残す

エンジニアを目指した経緯

1年間、プログラミングスクールのキャリアアドバイザー担当を務めていました。
その環境で、エンジニアの方と関わることが多く、プログラミングに触れる機会が多々あり、自分でもやってみようかなぁってなりました。

やってみると、凄く面白く、業務時間が終わるのが楽しみの生活になりました。笑

いっそのこと会社辞めて本気でエンジニア目指すか!
ってなり、退職しました。

エンジニアになった後のキャリア

正直あまり考えてません。
強いていうなら、世の中に存在する会社の生産性を上げることができるエンジニアとして活躍したいですね。
我ながら、縁の下の力持ちをすることが大好きな人間のため、自分が支えて周りが生産性を上がっていく環境作りをしていきたいです、

Qiitaに書くこと

・PHPの学習日記
・転職過程
・その他アウトプット

キノコ掘る??

彼女が一緒に田舎でキノコ堀りしてくれるらしいです。(なぜキノコなのかは不明)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel Commandを実装する(超初歩)

目的

  • Laravelにてコマンドを作成する方法をまとめる

実施環境

  • ハードウェア環境(下記の二つの環境で確認)
項目 情報
OS macOS Catalina(10.15.3)
ハードウェア MacBook Pro (16-inch ,2019)
プロセッサ 2.6 GHz 6コアIntel Core i7
メモリ 16 GB 2667 MHz DDR4
グラフィックス AMD Radeon Pro 5300M 4 GB Intel UHD Graphics 630 1536 MB
  • ソフトウェア環境
項目 情報 備考
PHP バージョン 7.4.3 Homwbrewを用いて導入
Laravel バージョン 7.0.8 commposerを用いて導入
MySQLバージョン 8.0.19 for osx10.13 on x86_64 Homwbrewを用いて導入

概要

  • ターミナルに「Test」と文字列を出力するだけのLaravelコマンドを作成する。
  • コマンド名は「app:test」とする。
  1. クラスの作成
  2. コマンドの内容の実行内容記載
  3. 確認

詳細

  1. クラスの作成

    1. アプリ名ディレクトリで下記コマンドを実行してクラスを作成する。(クラスの命名方法はキャメルケースを用いる)

      $ php artisan make:command TestCommand
      
    2. 下記にクラスが記載されているファイル「TestCommand.php」が作成されている事を確認する。

      • アプリ名ディレクトリ/app/Console/Commands
  2. コマンドの内容の実行内容記載

    1. アプリ名ディレクトリで下記コマンドを実行してクラスが記載されているファイルを開く。

      $ vi app/Console/Commands/TestCommand.php
      
    2. 開いたクラスファイルを下記の様に修正する。

      <?php
      
      namespace App\Console\Commands;
      
      use Illuminate\Console\Command;
      
      class TestCommand extends Command
      {
          /**
           * The name and signature of the console command.
           *
           * @var string
           */
      //    protected $signature = 'command:name';
         //上記の行をコメントアウト、もしくは削除して下記の行を追加
          protected $signature = 'app:test';
      
          /**
           * The console command description.
           *
           * @var string
           */
      //    protected $description = 'Command description';
          //上記の行をコメントアウト、もしくは削除して下記の行を追加
          protected $description = 'ターミナル上に"Test"と出力するコマンド';
      
          /**
           * Create a new command instance.
           *
           * @return void
           */
          public function __construct()
          {
              parent::__construct();
          }
      
          /**
           * Execute the console command.
           *
           * @return mixed
           */
          public function handle()
          {
              //下記を追加
              $this->info('Test');
          }
      }
      
  3. 確認

    1. アプリ名ディレクトリで下記コマンドを実行して現在使用可能なコマンドの一覧を表示する。

      $ php artisan list
      
    2. 先のコマンドを出力結果の中に下記の記載が存在する事を確認する。

      app
       app:test             コマンドの実装方法を確認するコマンド
      
    3. アプリ名ディレクトリで下記コマンドを実行してターミナル上に「Test」と出力される事を確認する。

      $ php artisan app:test
      Test
      
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHPの正規表現でHTMLタグ”以外”の検出

HTMLタグ”以外”の検出

PHPの正規表現でHTMLタグ”以外”を検出するために少々調べたのでまとめます。

与えられた文字列に
「HTMLタグが含まれていなければオッケー」
みたいなことをしたかったわけです。

アホみたいな書き方せずにもうちょっとちゃんと書くと、
与えられた文字列にHTMLタグが含まれていなければ
preg_match()1を返す
ということです。

パッと調べてみた感じ、HTMLタグをみつける正規表現はすぐでてきたのですが、
”以外”となると意外とみつからなかったです。いがいなだけにね。うん。

で、結果を先に書くと以下の通り

^(?!.*<("[^"]*"|'[^']*'|[^'">])*>).*$

正直、正規表現むっず〜となって途中で理解を断念したので、
完璧には理解できていませんが分かってることだけ書いておきます。

HTMLタグの検出

これは調べたらすぐに出てきました。

<(".*?"|'.*?'|[^'"])*?>

参考: iPentac.com

説明は参考に飛んでいただければすぐ出てくるのでそちらで。
要は<>に囲まれていて、中になにか書いてればそれはHTMLタグだ!っていうことです。

”以外”の検出

こちらも調べたら色々出てきましたが、否定先読みという言葉があるようですね。
詳しく知りたい方は正規表現 否定先読みで調べていただければもりもり出てくると思います。

こちらを参考にというかもうコピペして完成しました。
参考: taketiyo.log

確認のために使用したサービス

確認に使ったサービスはこちら。
PHP Live Regex
同様のページはたくさんありますが、
見やすくてなんだかかっこよかったので今後はこれを採用します。
おめでとう!ありがとう!

問題点

どうやらこの書き方だと<>だけでもHTMLタグとして認識するようです。
なんとなくもう少し良い書き方あるんじゃないかと思うのでなにか分かったら追記します。

まとめ

以下でHTMLタグ”以外”を検出できちゃ〜う!

^(?!.*<("[^"]*"|'[^']*'|[^'">])*>).*$

正規表現あんまわからん。
精進します。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む