カテゴリー
SugiBlog Webエンジニアのためのお役立ちTips

PHP preg_matche_all(正規表現)

<?php

$url = "http://www.yahoo.co.jp/";

// 正規表現パターン
$pattern = "/http:\/\/(.*)\.([[:alpha:]]{3,})\.([[:alpha:]\.\-_]{1,}).*/";

// 正規表現で値を取得
preg_match_all ($pattern, $url, $matches);

// $matches[0]はパターン全体にマッチした文字列の配列
for($i = 0; $i < count($matches[0]); $i++)
{
  echo $matches[0][$i].PHP_EOL;
}

// $matches[$j]は第$jのキャプチャ用サブパターンにマッチした文字列の配列
for($j = 1; $j < count($matches); $j++)
{
  for($i = 0; $i < count($matches[$j]); $i++)
  {
    echo $matches[$j][$i].PHP_EOL;
  }
}

?>

出力結果:
http://www.yahoo.co.jp/
www
yahoo
co.jp

1,088 views

XMLをPHP1行で解析

foreach(simplexml_load_file("ファイルのパス")->item as $it) echo $it->description
1,208 views

PHPでXMLファイルの解析

まずはXMLのサンプル

<?xml version="1.0" encoding="UTF-8" ?>
<rdf:RDF
  xmlns="http://purl.org/rss/1.0/"
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:admin="http://webns.net/mvcb/"
  xml:lang="ja">
  <channel rdf:about="http://www.example.jp/test.rdf">
    <title>title</title>
    <link>http://www.example.jp/</link>
    <dc:date>2006-07-06T20:14:34+09:00</dc:date>
    <description>description</description>
    <admin:generatorAgent rdf:resource="http://www.infomaker.jp/editorlite/?v=0.92b" />
    <items>
      <rdf:Seq>
        <rdf:li rdf:resource="http://www.example.jp/#he20060706"/>
      </rdf:Seq>
    </items>
  </channel>

  <item rdf:about="http://www.example.jp/#he20060706">
    <title>test</title>
    <link>http://www.example.jp/</link>
    <dc:date>2006-07-06</dc:date>
    <description>description</description>
  </item>

</rdf:RDF>

PHPで解析します。

// XMLファイルを読み込みインスタンスを生成
$xml = simplexml_load_file("ファイルのパス");
//$xml = new SimpleXMLElement("ファイルのパス", null, true); // この書き方でも可

// channel要素がある場合
//$channel = $xml->channel;
// 下のforeach取り出し元配列を$channel->itemに変更

foreach($xml->item as $item) {

    // 各内容を変数に格納
    //{
        $url         = $item->link;
        $title       = $item->title;
        $description = $item->description;

        // Namespace付の子要素を取得
        //{
            // childrenメソッドにて取得(引数のURLはxmlns:dc=[URL]から取得)
            $dc = $item->children('http://purl.org/dc/elements/1.1/');

            $date = date("Y-m-d", strtotime($dc->date));
        //}
    //}

}

dcとは?

Dublin Coreの略。
Dublin Coreモジュールとは、標準的なメタデータ記述要素として用いられるDublin CoreのDCMESを利用するモジュールです。

2,399 views

座標範囲の算出

ある地点から指定した半径以内に該当する座標を絞り込みたいとき、検索に使用する値を得るサンプルです。

考え方としては、指定した半径を基に矩形を作成し、その範囲に含まれる座標を検索する、というものです。
残念ながら“指定した半径を基に作成した円の中に含まれる”ではありません。

通常は2点間の距離を算出し、半径以内に収まるかを出したほうがいいのですが、比較するデータが多い場合は1つ1つ処理しているとかなり負荷がかかります。
そのため、ざっくり検索する方法をご紹介します。

今回はPHPのコードですが、JavaScriptなど他の言語でも利用できます。

まず、算出に必要な度数毎の距離を宣言します。

// 緯度1秒の平均距離 約30.9m
// 緯度35度上の緯度1秒の距離 約30.8m
$lat_length = 30.9;

// 緯度35度上の経度1秒の距離 約25m
$lng_length = 25;

探したい範囲の半径(km)を設定します。 続きを読む…»

4,067 views

ランダムなパスワード生成

function mkCrypt()
{
    // 配列生成
    $ARRAY1 = range("0", "9");
    $ARRAY2 = range("a", "z");
    $ARRAY3 = range("A", "Z");
    $ARRAY  = array_merge($ARRAY1, $ARRAY2, $ARRAY3);

    $a_pw = "";
    $cnt  = count($ARRAY) - 1;

    // 乱数初期化
    srand((double)microtime()*1000000);


    // ランダム暗号生成
    for($i = 1; $i < = 8; $i++)
    {
        $num   = round(rand(0, $cnt));
        $a_pw .= $ARRAY[$num];
    }

    return $a_pw;
}

または、一意なIDを生成するuniqid関数を使用する

md5(uniqid()); //php5以降のみ
md5(uniqid(rand(), true));

Apache Basic 認証用パスワード生成
function CryptBasic($id, $pw)
{
    $sal = substr($id, 0, 2);
    $pw_crypt = crypt($pw, $sal);

    return $pw_crypt;
}
1,307 views