私的良スレ書庫
不明な単語は2ch用語を / 要望・削除依頼は掲示板へ。不適切な画像報告もこちらへどうぞ。 / 管理情報はtwitterでログインするとレス評価できます。 登録ユーザには一部の画像が表示されますので、問題のある画像や記述を含むレスに「禁」ボタンを押してください。
元スレ+ JavaScript の質問用スレッド vol.95 +
JavaScript スレッド一覧へ / JavaScript とは? / 携帯版 / dat(gz)で取得 / トップメニューみんなの評価 :
レスフィルター : (試験中)
正規表現で書いたよー。
function calc(expr) {
return expr.replace(/\(([^()]+)\)|\((.+)\)/g,function(x,a,b) { return calc(a||b); })
.replace(/((?:\d+[*/])+)(\d+)/g,function(x,a,b) { b*=1; return (a.slice(-1)==="*")? calc(a.slice(0,-1))*b : calc(a.slice(0,-1))/b; })
.replace(/((?:\d+[+-])+)(\d+)/g,function(x,a,b) { b*=1; return (a.slice(-1)==="+")? calc(a.slice(0,-1))+b : calc(a.slice(0,-1))-b; })*1;
}
alert(calc("1+2+(3*4)+5*7-((30/6)*(2*10/5+3-(1-1)))+31"));
function calc(expr) {
return expr.replace(/\(([^()]+)\)|\((.+)\)/g,function(x,a,b) { return calc(a||b); })
.replace(/((?:\d+[*/])+)(\d+)/g,function(x,a,b) { b*=1; return (a.slice(-1)==="*")? calc(a.slice(0,-1))*b : calc(a.slice(0,-1))/b; })
.replace(/((?:\d+[+-])+)(\d+)/g,function(x,a,b) { b*=1; return (a.slice(-1)==="+")? calc(a.slice(0,-1))+b : calc(a.slice(0,-1))-b; })*1;
}
alert(calc("1+2+(3*4)+5*7-((30/6)*(2*10/5+3-(1-1)))+31"));
>>309
そうだろw普通こういうのは正規表現オンリーでやらないからな。絶対対応しきれない。
そうだろw普通こういうのは正規表現オンリーでやらないからな。絶対対応しきれない。
指摘された 2つはいった。
function calc(expr) {
return expr.replace(/\(([^()]+)\)|\((.+)\)/g,function(x,a,b) { return calc(a||b); })
.replace(/((?:-?\d+(?:\.\d*)?[*/])+)(-?\d+(?:\.\d*)?)/g,function(x,a,b) { b*=1; return (a.slice(-1)==="*")? calc(a.slice(0,-1))*b : calc(a.slice(0,-1))/b; })
.replace(/((?:-?\d+(?:\.\d*)?[+-])+)(-?\d+(?:\.\d*)?)/g,function(x,a,b) { b*=1; return (a.slice(-1)==="+")? calc(a.slice(0,-1))+b : calc(a.slice(0,-1))-b; })*1;
}
function calc(expr) {
return expr.replace(/\(([^()]+)\)|\((.+)\)/g,function(x,a,b) { return calc(a||b); })
.replace(/((?:-?\d+(?:\.\d*)?[*/])+)(-?\d+(?:\.\d*)?)/g,function(x,a,b) { b*=1; return (a.slice(-1)==="*")? calc(a.slice(0,-1))*b : calc(a.slice(0,-1))/b; })
.replace(/((?:-?\d+(?:\.\d*)?[+-])+)(-?\d+(?:\.\d*)?)/g,function(x,a,b) { b*=1; return (a.slice(-1)==="+")? calc(a.slice(0,-1))+b : calc(a.slice(0,-1))-b; })*1;
}
渡された文字列が計算式かどうかを判定してevalだろ
計算式以外の文字列ならエラー返せばよいわけだし
()+-*/^%1234567890.以外の文字があれば弾けばだいたい安全だろ
計算式以外の文字列ならエラー返せばよいわけだし
()+-*/^%1234567890.以外の文字があれば弾けばだいたい安全だろ
>>312
それでおk
それでおk
おkじゃねーよw
計算式かどうかチェックしたあとにエネルギー線によって
ビットアップセットが起きる場合も考えないといけない
その場合eval使ってた方が確率的に危険だろが
計算式かどうかチェックしたあとにエネルギー線によって
ビットアップセットが起きる場合も考えないといけない
その場合eval使ってた方が確率的に危険だろが
>>320
さすがにそれはカッコが必要だと思う
さすがにそれはカッコが必要だと思う
>320
とりあえず今月中にいいの作ってくるから待ってて
とりあえず今月中にいいの作ってくるから待ってて
おまえら>>110から200レスもevalで喧嘩してるのか…
・evalは絶対に使うべきではない
・基本的には避けるべきだが、局所的にevalの使用機会がある
・evalは積極手に使うべき
・基本的には避けるべきだが、局所的にevalの使用機会がある
・evalは積極手に使うべき
盛り上がってるね。数式のパース書いてみたけど。個人的にはちゃんと
チェックできる奴が分かっていて使うeval()は必要悪、みたいに思う。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML//EN">
<html><head><title>???</title>
<script type="text/javascript">
var s = '1+2';
function exp() {
var v = term();
while(s.match(/^[+-]/)) {
if(s.match(/^[+]/)) { s = s.substring(1); w = exp(); v += w; }
else { s = s.substring(1); w = exp(); v -= w; } }
if(s.match(/./) && !s.match(/^[)]/)) throw 'syntax'; else return v;
}
function term() {
var v = fact();
while(s.match(/^[*/]/)) {
if(s.match(/^[*]/)) { s = s.substring(1); w = term(); v *= w; }
else { s = s.substring(1); w = term(); v /= w; } }
if(s.match(/./) && !s.match(/^[-+)]/)) throw 'syntax'; else return v;
}
つづく(2レスなのでご容赦を)
チェックできる奴が分かっていて使うeval()は必要悪、みたいに思う。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML//EN">
<html><head><title>???</title>
<script type="text/javascript">
var s = '1+2';
function exp() {
var v = term();
while(s.match(/^[+-]/)) {
if(s.match(/^[+]/)) { s = s.substring(1); w = exp(); v += w; }
else { s = s.substring(1); w = exp(); v -= w; } }
if(s.match(/./) && !s.match(/^[)]/)) throw 'syntax'; else return v;
}
function term() {
var v = fact();
while(s.match(/^[*/]/)) {
if(s.match(/^[*]/)) { s = s.substring(1); w = term(); v *= w; }
else { s = s.substring(1); w = term(); v /= w; } }
if(s.match(/./) && !s.match(/^[-+)]/)) throw 'syntax'; else return v;
}
つづく(2レスなのでご容赦を)
function fact() {
if(s.match(/^[0-9]/)) {
var t=s.match(/^[0-9]+/)[0]; s=s.substring(t.length); return parseInt(t); }
if(s.match(/^[(]/)) {
s = s.substring(1); var v = exp();
if(s.match(/^[)]/)) { s = s.substring(1); return v; } else throw 'syntax'; }
}
function calc() {
try {
s = document.getElementById('t0').value; alert(exp());
} catch(e) { alert('syntax error, seeing:' + s); }
}
</script>
</head><body>
<div><input type="text" id="t0" value="((1+2+3)*2+19*(30*2))/2">
<button onclick="calc()">calc</button></div></body></html>
if(s.match(/^[0-9]/)) {
var t=s.match(/^[0-9]+/)[0]; s=s.substring(t.length); return parseInt(t); }
if(s.match(/^[(]/)) {
s = s.substring(1); var v = exp();
if(s.match(/^[)]/)) { s = s.substring(1); return v; } else throw 'syntax'; }
}
function calc() {
try {
s = document.getElementById('t0').value; alert(exp());
} catch(e) { alert('syntax error, seeing:' + s); }
}
</script>
</head><body>
<div><input type="text" id="t0" value="((1+2+3)*2+19*(30*2))/2">
<button onclick="calc()">calc</button></div></body></html>
>>332
はい、そりゃ誰でも書けるとは思います。練習としてやってみました。
はい、そりゃ誰でも書けるとは思います。練習としてやってみました。
>>333
最終的にJSパーサーを作るまでやるから
最終的にJSパーサーを作るまでやるから
>>332
カッコ使えないじゃん
カッコ使えないじゃん
JavaScriptでevalを使うなって話は
Cでgotoを使うなって話に似てる。
判って使う分には問題ない。
むしろ、他人の「使うな」って評価を無批判に受け入れちゃう方が問題。
自分で熟慮して、「使うな」って自分を律する事には口を挟まない。
Cでgotoを使うなって話に似てる。
判って使う分には問題ない。
むしろ、他人の「使うな」って評価を無批判に受け入れちゃう方が問題。
自分で熟慮して、「使うな」って自分を律する事には口を挟まない。
(おいおいコイツらいつまでやってんだよさっさと出てけよ・・・)
>>342
どこにもJSONが見つからないよ
どこにもJSONが見つからないよ
勉強してていくつか質問
1.ダブルクオーテーションの中ではシングルクォートを使うってのが分かったんだけど
更にシングルクォートの中で文字を囲いたいときにはどうするの?
シングルクォート以降はエスケープってやつをしなきゃいけないの?
入門書を見ながら勉強してて少しは慣れてきたんだけど
Jsの書き方のルールに苦戦しててよく間違えてエラーで怒られる。
2.イコールの後の文字は必ずダブルクオーテーションで囲わないとダメって認識であってる?
3.下の構文なんだけど同じ「visibility」メソッド?でも後に続くプロパティの間の記号が
「=」と「:」があるんだけど、どう使い分けたらいいの?
スタイルシートだからコロンになってるの?
だとするとそれ以外は全部「=」を使えばOKなの?
<input type = "button" value = "文章を消す"
onclick = "document.all('text').style.visiblity = 'visible'">
<div id = "text2" style = "position:absolute; left30; top:120; color:red;" visibility:hidden;">
1.ダブルクオーテーションの中ではシングルクォートを使うってのが分かったんだけど
更にシングルクォートの中で文字を囲いたいときにはどうするの?
シングルクォート以降はエスケープってやつをしなきゃいけないの?
入門書を見ながら勉強してて少しは慣れてきたんだけど
Jsの書き方のルールに苦戦しててよく間違えてエラーで怒られる。
2.イコールの後の文字は必ずダブルクオーテーションで囲わないとダメって認識であってる?
3.下の構文なんだけど同じ「visibility」メソッド?でも後に続くプロパティの間の記号が
「=」と「:」があるんだけど、どう使い分けたらいいの?
スタイルシートだからコロンになってるの?
だとするとそれ以外は全部「=」を使えばOKなの?
<input type = "button" value = "文章を消す"
onclick = "document.all('text').style.visiblity = 'visible'">
<div id = "text2" style = "position:absolute; left30; top:120; color:red;" visibility:hidden;">
前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ / 要望・削除依頼は掲示板へ / 管理情報はtwitterで / JavaScript スレッド一覧へ
みんなの評価 : 類似してるかもしれないスレッド
- + JavaScript の質問用スレッド vol.96 + (1001) - [97%] - 2012/1/28 23:01
- + JavaScript の質問用スレッド vol.75 + (1001) - [97%] - 2010/1/23 1:07 ○
- + JavaScript の質問用スレッド vol.99 + (1001) - [97%] - 2012/5/7 4:32
- + JavaScript の質問用スレッド vol.98 + (1001) - [97%] - 2012/4/9 14:46
- + JavaScript の質問用スレッド vol.97 + (1001) - [97%] - 2012/3/1 3:31
- + JavaScript の質問用スレッド vol.94 + (1001) - [97%] - 2012/1/8 15:46
- + JavaScript の質問用スレッド vol.93 + (1001) - [97%] - 2012/1/1 4:46
- + JavaScript の質問用スレッド vol.93 + (1001) - [97%] - 2011/12/10 18:31
- + JavaScript の質問用スレッド vol.90 + (1001) - [97%] - 2011/11/15 20:32
- + JavaScript の質問用スレッド vol.90 + (1001) - [97%] - 2011/10/26 4:18
- + JavaScript の質問用スレッド vol.85 + (1001) - [97%] - 2011/4/25 21:32
- + JavaScript の質問用スレッド vol.105 + (1001) - [95%] - 2013/5/20 4:45
- + JavaScript の質問用スレッド vol.115 + (1001) - [95%] - 2014/5/29 16:16
- + JavaScript の質問用スレッド vol.135 + (1002) - [95%] - 2018/11/23 10:30
- + JavaScript の質問用スレッド vol.125 + (1001) - [95%] - 2015/10/7 17:45
- + JavaScript の質問用スレッド vol.88 + (1001) - [95%] - 2011/7/20 7:03
- + JavaScript の質問用スレッド vol.89 + (1001) - [95%] - 2011/9/4 4:17
トップメニューへ / →のくす牧場書庫について