function check(){
var flag = 0;
if(!document.form.mail.value.match(/.+@.+\..+/)){
flag = 1;
}
if(flag){
window.alert('メールアドレスが正しくありません');
return false;
} else{
true;
}
}

ソフトウェアエンジニアの技術ブログ:Software engineer tech blog
随机应变 ABCD: Always Be Coding and … : хороший
function check(){
var flag = 0;
if(!document.form.mail.value.match(/.+@.+\..+/)){
flag = 1;
}
if(flag){
window.alert('メールアドレスが正しくありません');
return false;
} else{
true;
}
}

■mysql側
まず、テーブルを作ります。
1.管理画面側で予約情報をcake.phpで閲覧できるようにしたいので、テーブル名は複数にします。
2.いたずらの予約が複数回あった場合は、そのipアドレスをhtaccessでアクセス制御できるようにしたいので、ipアドレスと、user agentのカラムを作ります。
3.予約送信時間の型は、yyyy-mm-ddではなくyyyy-mm-dd h:i:sなので、dateではなくdatetimeにします。(間違えました)
4.管理者画面で後からメモをinsert出来るようにしたいので、memoのカラムを作ります。
create table reserve.masters(
id int unsigned auto_increment primary key,
day varchar(255),
time1 varchar(41),
time2 varchar(41),
course varchar(41),
charge varchar(41),
name varchar(41),
mail varchar(41),
ip varchar(255),
useragent varchar(255),
created datetime,
memo varchar(255)
);

■php側
普通のpdoです。REMOTE_ADDRとHTTP_USER_AGENTでユーザー情報を取得しています。
$start = $_POST['stime'];
$end = $_POST['etime'];
$ip = $_SERVER['REMOTE_ADDR'];
$useragent = $_SERVER['HTTP_USER_AGENT'];
$date = date('Y-m-d H:i:s');
$dsn = "mysql:dbname=reserve;host=localhost";
$user = "hoge";
$password = "hogehoge";
try {
$dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e){
print('connection failed:'.$e->getMessage());
}
$stmt = $dbh -> prepare("INSERT INTO masters (day, time1, time2, course, charge, name, mail, ip, useragent, created) VALUES(:day, :time1, :time2, :course, :charge, :name, :mail, :ip, :useragent, :created)");
$stmt->bindParam(':day', $_POST['day'], PDO::PARAM_STR);
$stmt->bindParam(':time1', $_POST['time1'], PDO::PARAM_STR);
$stmt->bindParam(':time2', $_POST['time2'], PDO::PARAM_STR);
$stmt->bindParam(':course', $_POST['course'], PDO::PARAM_STR);
$stmt->bindParam(':charge', $_POST['charge'], PDO::PARAM_STR);
$stmt->bindParam(':name', $_POST['name'], PDO::PARAM_STR);
$stmt->bindParam(':mail', $_POST['mail'], PDO::PARAM_STR);
$stmt->bindParam(':ip', $ip, PDO::PARAM_STR);
$stmt->bindParam(':useragent', $useragent, PDO::PARAM_STR);
$stmt->bindParam(':created', $date, PDO::PARAM_STR);
$stmt->execute();
■画面遷移
1.入力フォーム

2.確認画面

3.thankyou画面

4.メール受信

5.mysql

ここまでは特に問題なさそうです。
次はvalidation周りを作っていきたいと思います。
mb_send_mailでメールを送る。
if(!isset($_POST['name'])){
header('Location: http://192.168.33.10:8000');
} else {
$name = $_POST['name'];
$mail = $_POST['mail'];
$day = $_POST['day'];
$time = $_POST['time'];
$hour = floor($time / 60);
$minutes = $time % 60;
if(!$minutes == NUll ){
$stime = $hour.":".$minutes;
} else {
$stime = $hour.":00";
}
$time =$_POST['time'] + $_POST['course'];
$hour = floor($time / 60);
$minutes = $time % 60;
if(!$minutes == NUll ){
$etime = $hour.":".$minutes;
} else {
$etime = $hour.":00";
}
$course = $_POST['course'];
$lawyer = $_POST['lawyer'];
}
if(isset($_POST["submit"])){
mb_language('ja');
mb_internal_encoding("utf-8");
$start = $_POST['stime'];
$end = $_POST['etime'];
$subject = "[自動送信]お問い合わせありがとうございます";
$body = <<< EOM
{$name} 様
この度はご予約ありがとうございます。
以下のご予約内容を承りました。
===================================================
【 お名前 】
{$name} 様
【 メールアドレス 】
{$mail}
【 ご予約日時 】
{$day} {$start} ~ {$end}
【 コース 】
{$course} 分
【 担当弁護士 】
{$lawyer}
===================================================
内容を確認のうえ、回答させて頂きます。
〇〇弁護士事務所
EOM;
$fromEmail = "hoge@gmail.com";
$fromName = "〇〇事務所";
$header = "From:".mb_encode_mimeheader($fromName)."<$fromEmail>";
mb_send_mail($mail,$subject,$body,$header);
// header("Location: thanks.php");
exit;
}
?>
<form action="" method="post">
<input type="hidden" name="name" value="<?php echo $name; ?>">
<input type="hidden" name="mail" value="<?php echo $mail; ?>">
<input type="hidden" name="day" value="<?php echo $day; ?>">
<input type="hidden" name="stime" value="<?php echo $stime; ?>">
<input type="hidden" name="etime" value="<?php echo $etime; ?>">
<input type="hidden" name="course" value="<?php echo $course; ?>">
<input type="hidden" name="lawyer" value="<?php echo $lawyer; ?>">
<h1>お問い合わせ内容の確認</h1>
<p>お問い合わせ内容はこちらで宜しいでしょうか?<br>
よろしければ「送信する」ボタンを押してください。<hr>
<b>お名前</b><br>
<?php echo $name; ?>様<br>
<b>メールアドレス</b><br>
<?php echo $mail; ?><br>
<b>日付</b><br>
<?php echo $day; ?><br>
<b>時間</b><br>
<?php echo $stime; ?>~<?php echo $etime; ?><br>
<b>コース</b><br>
<?php echo $course; ?>分<br>
<b>担当</b><br>
<?php echo $lawyer; ?><br><br>
<input type="button" value="内容を修正する" onclick="history.back(-1)">
<button type="submit" name="submit">送信する</button>
</form>

メール

03-6803-5794から、”03-“をstr_replaceすると、重複して削除され、685794になってしまう。

preg_replaceなら、回数を指定できる。
$num1 = strstr($number, '-', true);
$num = preg_replace("/".$num1."-/","", $number, 1);
$num2 = strstr($num, '-', true);
$num3 = str_replace("".$num2."-","", $num);

strstr trueでハイフン(-)より前を抜き出し、str_replaceで抜き出した数+ハイフンを削除して、またstrstr trueでハイフン(-)より前を抜き出します。
$number = empty($_GET["p"])? NULL: $_GET["p"];
$number = str_replace('-','', $number);
require "function.php";
$number = format_phone_number($number);
$num1 = strstr($number, '-', true);
$num = str_replace("".$num1."-","", $number);
$num2 = strstr($num, '-', true);
$num3 = str_replace("".$num2."-","", $num);
echo $num1 . "<br>";
echo $num2 . "<br>";
echo $num3;

おおおおお


電話番号の市外局番、市内局番を分岐させようと条件分岐式を書いていましたが
$number = str_replace('-','', $number);
$num_2 = substr($number, 0, 2);
$num_5 = substr($number, 0, 5);
if($num_2 == '03' or $num_2 == '04' or $num_2 == '06'){
$num1 = substr($number, 0, 2);
$num2 = substr($number, 2, 4);
$num3 = substr($number, 6, 4);
}elseif($num_5 == '01372' or $num_5 == '01374' or $num_5 == '01377' or $num_5 == '' or $num_5 == '' or $num_5 == '' or $num_5 == '' or $num_5 == '' or $num_5 == '' or $num_5 == '' or $num_5 == '' or $num_5 == '' or $num_5 == '' or $num_5 == '' or $num_5 == '' or $num_5 == '' or $num_5 == '' or $num_5 == '' or $num_5 == '' or $num_5 == '')
書いている途中で車輪の再発明は辞めようと思いました。
function.php
function format_phone_number($input, $strict = false) {
$groups = array(
5 =>
array (
'01564' => 1,
'01558' => 1,
'01586' => 1,
'01587' => 1,
'01634' => 1,
'01632' => 1,
'01547' => 1,
'05769' => 1,
'04992' => 1,
'04994' => 1,
'01456' => 1,
'01457' => 1,
'01466' => 1,
'01635' => 1,
'09496' => 1,
'08477' => 1,
'08512' => 1,
'08396' => 1,
'08388' => 1,
'08387' => 1,
'08514' => 1,
'07468' => 1,
'01655' => 1,
'01648' => 1,
'01656' => 1,
'01658' => 1,
'05979' => 1,
'04996' => 1,
'01654' => 1,
'01372' => 1,
'01374' => 1,
'09969' => 1,
'09802' => 1,
'09912' => 1,
'09913' => 1,
'01398' => 1,
'01377' => 1,
'01267' => 1,
'04998' => 1,
'01397' => 1,
'01392' => 1,
),
4 =>
array (
'0768' => 2,
'0770' => 2,
'0772' => 2,
'0774' => 2,
'0773' => 2,
'0767' => 2,
'0771' => 2,
'0765' => 2,
'0748' => 2,
'0747' => 2,
'0746' => 2,
'0826' => 2,
'0749' => 2,
'0776' => 2,
'0763' => 2,
'0761' => 2,
'0766' => 2,
'0778' => 2,
'0824' => 2,
'0797' => 2,
'0796' => 2,
'0555' => 2,
'0823' => 2,
'0798' => 2,
'0554' => 2,
'0820' => 2,
'0795' => 2,
'0556' => 2,
'0791' => 2,
'0790' => 2,
'0779' => 2,
'0558' => 2,
'0745' => 2,
'0794' => 2,
'0557' => 2,
'0799' => 2,
'0738' => 2,
'0567' => 2,
'0568' => 2,
'0585' => 2,
'0586' => 2,
'0566' => 2,
'0564' => 2,
'0565' => 2,
'0587' => 2,
'0584' => 2,
'0581' => 2,
'0572' => 2,
'0574' => 2,
'0573' => 2,
'0575' => 2,
'0576' => 2,
'0578' => 2,
'0577' => 2,
'0569' => 2,
'0594' => 2,
'0827' => 2,
'0736' => 2,
'0735' => 2,
'0725' => 2,
'0737' => 2,
'0739' => 2,
'0743' => 2,
'0742' => 2,
'0740' => 2,
'0721' => 2,
'0599' => 2,
'0561' => 2,
'0562' => 2,
'0563' => 2,
'0595' => 2,
'0596' => 2,
'0598' => 2,
'0597' => 2,
'0744' => 2,
'0852' => 2,
'0956' => 2,
'0955' => 2,
'0954' => 2,
'0952' => 2,
'0957' => 2,
'0959' => 2,
'0966' => 2,
'0965' => 2,
'0964' => 2,
'0950' => 2,
'0949' => 2,
'0942' => 2,
'0940' => 2,
'0930' => 2,
'0943' => 2,
'0944' => 2,
'0948' => 2,
'0947' => 2,
'0946' => 2,
'0967' => 2,
'0968' => 2,
'0987' => 2,
'0986' => 2,
'0985' => 2,
'0984' => 2,
'0993' => 2,
'0994' => 2,
'0997' => 2,
'0996' => 2,
'0995' => 2,
'0983' => 2,
'0982' => 2,
'0973' => 2,
'0972' => 2,
'0969' => 2,
'0974' => 2,
'0977' => 2,
'0980' => 2,
'0979' => 2,
'0978' => 2,
'0920' => 2,
'0898' => 2,
'0855' => 2,
'0854' => 2,
'0853' => 2,
'0553' => 2,
'0856' => 2,
'0857' => 2,
'0863' => 2,
'0859' => 2,
'0858' => 2,
'0848' => 2,
'0847' => 2,
'0835' => 2,
'0834' => 2,
'0833' => 2,
'0836' => 2,
'0837' => 2,
'0846' => 2,
'0845' => 2,
'0838' => 2,
'0865' => 2,
'0866' => 2,
'0892' => 2,
'0889' => 2,
'0887' => 2,
'0893' => 2,
'0894' => 2,
'0897' => 2,
'0896' => 2,
'0895' => 2,
'0885' => 2,
'0884' => 2,
'0869' => 2,
'0868' => 2,
'0867' => 2,
'0875' => 2,
'0877' => 2,
'0883' => 2,
'0880' => 2,
'0879' => 2,
'0829' => 2,
'0550' => 2,
'0228' => 2,
'0226' => 2,
'0225' => 2,
'0224' => 2,
'0229' => 2,
'0233' => 2,
'0237' => 2,
'0235' => 2,
'0234' => 2,
'0223' => 2,
'0220' => 2,
'0192' => 2,
'0191' => 2,
'0187' => 2,
'0193' => 2,
'0194' => 2,
'0198' => 2,
'0197' => 2,
'0195' => 2,
'0238' => 2,
'0240' => 2,
'0260' => 2,
'0259' => 2,
'0258' => 2,
'0257' => 2,
'0261' => 2,
'0263' => 2,
'0266' => 2,
'0265' => 2,
'0264' => 2,
'0256' => 2,
'0255' => 2,
'0243' => 2,
'0242' => 2,
'0241' => 2,
'0244' => 2,
'0246' => 2,
'0254' => 2,
'0248' => 2,
'0247' => 2,
'0186' => 2,
'0185' => 2,
'0144' => 2,
'0143' => 2,
'0142' => 2,
'0139' => 2,
'0145' => 2,
'0146' => 2,
'0154' => 2,
'0153' => 2,
'0152' => 2,
'0138' => 2,
'0137' => 2,
'0125' => 2,
'0124' => 2,
'0123' => 2,
'0126' => 2,
'0133' => 2,
'0136' => 2,
'0135' => 2,
'0134' => 2,
'0155' => 2,
'0156' => 2,
'0176' => 2,
'0175' => 2,
'0174' => 2,
'0178' => 2,
'0179' => 2,
'0184' => 2,
'0183' => 2,
'0182' => 2,
'0173' => 2,
'0172' => 2,
'0162' => 2,
'0158' => 2,
'0157' => 2,
'0163' => 2,
'0164' => 2,
'0167' => 2,
'0166' => 2,
'0165' => 2,
'0267' => 2,
'0250' => 2,
'0533' => 2,
'0422' => 2,
'0532' => 2,
'0531' => 2,
'0436' => 2,
'0428' => 2,
'0536' => 2,
'0299' => 2,
'0294' => 2,
'0293' => 2,
'0475' => 2,
'0295' => 2,
'0297' => 2,
'0296' => 2,
'0495' => 2,
'0438' => 2,
'0466' => 2,
'0465' => 2,
'0467' => 2,
'0478' => 2,
'0476' => 2,
'0470' => 2,
'0463' => 2,
'0479' => 2,
'0493' => 2,
'0494' => 2,
'0439' => 2,
'0268' => 2,
'0480' => 2,
'0460' => 2,
'0538' => 2,
'0537' => 2,
'0539' => 2,
'0279' => 2,
'0548' => 2,
'0280' => 2,
'0282' => 2,
'0278' => 2,
'0277' => 2,
'0269' => 2,
'0270' => 2,
'0274' => 2,
'0276' => 2,
'0283' => 2,
'0551' => 2,
'0289' => 2,
'0287' => 2,
'0547' => 2,
'0288' => 2,
'0544' => 2,
'0545' => 2,
'0284' => 2,
'0291' => 2,
'0285' => 2,
'0120' => 3,
'0570' => 3,
'0800' => 3,
'0990' => 3,
),
3 =>
array (
'099' => 3,
'054' => 3,
'058' => 3,
'098' => 3,
'095' => 3,
'097' => 3,
'052' => 3,
'053' => 3,
'011' => 3,
'096' => 3,
'049' => 3,
'015' => 3,
'048' => 3,
'072' => 3,
'084' => 3,
'028' => 3,
'024' => 3,
'076' => 3,
'023' => 3,
'047' => 3,
'029' => 3,
'075' => 3,
'025' => 3,
'055' => 3,
'026' => 3,
'079' => 3,
'082' => 3,
'027' => 3,
'078' => 3,
'077' => 3,
'083' => 3,
'022' => 3,
'086' => 3,
'089' => 3,
'045' => 3,
'044' => 3,
'092' => 3,
'046' => 3,
'017' => 3,
'093' => 3,
'059' => 3,
'073' => 3,
'019' => 3,
'087' => 3,
'042' => 3,
'018' => 3,
'043' => 3,
'088' => 3,
'050' => 4,
),
2 =>
array (
'04' => 4,
'03' => 4,
'06' => 4,
),
);
$groups[3] +=
$strict ?
array(
'020' => 3,
'070' => 3,
'080' => 3,
'090' => 3,
) :
array(
'020' => 4,
'070' => 4,
'080' => 4,
'090' => 4,
)
;
$number = preg_replace('/[^\d]++/', '', $input);
foreach ($groups as $len => $group) {
$area = substr($number, 0, $len);
if (isset($group[$area])) {
$formatted = implode('-', array(
$area,
substr($number, $len, $group[$area]),
substr($number, $len + $group[$area])
));
return strrchr($formatted, '-') !== '-' ? $formatted : $input;
}
}
$pattern = '/\A(00(?:[013-8]|2\d|91[02-9])\d)(\d++)\z/';
if (preg_match($pattern, $number, $matches)) {
return $matches[1] . '-' . $matches[2];
}
return $input;
}
修正
function.phpをrequire
$number = empty($_GET["p"])? NULL: $_GET["p"];
$number = str_replace('-','', $number);
require "function.php";
$number = format_phone_number($number);
echo $number;

globで取得します。
if($_POST["search"]){
$number = htmlspecialchars($_POST["search"]);
$number = str_replace('-','', $number);
}
echo $number."<br>";
foreach(glob("number/".$number."*") as $file){
if(is_file($file)){
$url = substr($file, 7);
echo "<a href=\"".$file."\">" .rtrim($url, '.php')."</a><br>";
}
}
検索フォーム

一致ファイルを表示

秒単位ならsleep
echo date("h:i:s")."<br>";
sleep(1);
echo date("h:i:s");
03:25:13
03:25:14
それより細かくならusleep, 500000msで0.5秒
echo date("h:i:s")."<br>";
usleep(500000);
echo date("h:i:s");
view
<?php
include 'voicetext.php';
?>
<style>
.form{
width:500px;
}
</style>
<body>
<span>テキストを入力してください</span><br>
<form id="form" name="form" action="" method="POST">
<input id="input_text" type="text" class="form" name="input_text" value="">
<button type="submit">変換する</button>
</form>
<span>変換した音声を再生する</span><br>
<audio id="audio" controls>
<source src="voice.mp3">
</audio><br>
<input type="button" value="play" onclick="audio_play()">
<input type="button" value="pause" onclick="audio_pause()">
<script type="text/javascript">
function audio_play() { audio.play();}
function audio_pause() { audio.pause();}
</script>
voicetext.php
hikariの声を使います。
https://cloud.voicetext.jp/webapi/docs/api
curl
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://api.voicetext.jp/v1/tts");
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$authorized = "do not watch";
curl_setopt($ch,CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch,CURLOPT_USERPWD,$authorized);
$post_array = array("text" => $_POST["input_text"], "speaker" => "hikari", "emotion" => "happiness", "pitch" => "80", "emotion_level" => "4");
$postdata = "";
foreach ($post_array as $key => $val){
$postdata.= urlencode($key) . '=' . urlencode($val). '&';
}
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
$output = curl_exec($ch);
curl_close($ch);
$fp = fopen("voice.mp3","w");
fwrite($fp, $output);
fclose($fp);
browser

mp3
HOYA株式会社:光学機器・ガラスメーカー
東京都新宿区西新宿6-10-1 日土地西新宿ビル 20F
代表:鈴木洋
天気予報RSSをmp3に変換してみます。
テキスト:[ 東京都の天気概況 ] 本州付近は高気圧に覆われています。 【関東甲信地方】 関東甲信地方は、甲信地方は晴れている所もありますが、関東地方はおお むね曇りとなっています。 3日は、高気圧に覆われて晴れますが、湿った空気の影響により、朝晩中 心に曇る所があるでしょう。
笑)これは、ちょっと違う 〇やってる人みたいですね。
emotionとemotion levelをなくします。
ほう
cloud speech api

$zip = "1530042";
$base_url = "http://zipcloud.ibsnet.co.jp/api/search?zipcode=".$zip."";
$json = file_get_contents($base_url);
print_r('<pre>');
var_dump($json);
print_r('</pre>');
$arr = json_decode($json, true);
echo $arr['results'][0]['address1']. "<br>";
echo $arr['results'][0]['address2']. "<br>";
echo $arr['results'][0]['address3'];
string(293) “{
“message”: null,
“results”: [
{
“address1”: “東京都”,
“address2”: “目黒区”,
“address3”: “青葉台”,
“kana1”: “トウキョウト”,
“kana2”: “メグロク”,
“kana3”: “アオバダイ”,
“prefcode”: “13”,
“zipcode”: “1530042”
}
],
“status”: 200
}”
東京都
目黒区
青葉台