回答編集履歴

4

微修正

2017/02/21 07:27

投稿

Zuishin
Zuishin

スコア28660

test CHANGED
@@ -30,13 +30,13 @@
30
30
 
31
31
  $number = "(\\d+(\\.\\d+)?)";
32
32
 
33
- $pow = "(pow\\((?R),\\s*(?R)\\))";
33
+ $pow = "(pow\\((?R),(?R)\\))";
34
34
 
35
35
  $func = "{$pow}";
36
36
 
37
37
  $factor = "(-?({$number}|\(\\s*(?R)\\s*\)|{$func}))";
38
38
 
39
- $expression = "(?>\\s*$factor(\\s*[\+\-\*\/%]\\s*$factor)*\\s*)";
39
+ $expression = "(?>\\s*{$factor}(\\s*[\\+\\-\\*\\/\\%]\\s*{$factor})*\\s*)";
40
40
 
41
41
  $pattern = "/{$expression}/";
42
42
 
@@ -61,3 +61,9 @@
61
61
  ```
62
62
 
63
63
 
64
+
65
+ 追記
66
+
67
+
68
+
69
+ ちょっと修正を入れました。

3

追記

2017/02/21 07:27

投稿

Zuishin
Zuishin

スコア28660

test CHANGED
@@ -9,3 +9,55 @@
9
9
 
10
10
 
11
11
  失礼しました。php_check_syntax は廃止されていますね。私なら正規表現を使うか独自に構文解析を作ります。数式に限定されているので、得られたトークンをもとに構文解析したとしてもそれほど大げさなことにはなりそうもない気もしますが、正規表現の方が楽かもしれませんね。
12
+
13
+
14
+
15
+ 追記
16
+
17
+
18
+
19
+ 定石はよく知りませんが、試しに作ってみました。
20
+
21
+ 四則演算、剰余、累乗に対応しています。
22
+
23
+ $input に適当な文字列を入れて試してみてください。
24
+
25
+
26
+
27
+ ```PHP
28
+
29
+ <?php
30
+
31
+ $number = "(\\d+(\\.\\d+)?)";
32
+
33
+ $pow = "(pow\\((?R),\\s*(?R)\\))";
34
+
35
+ $func = "{$pow}";
36
+
37
+ $factor = "(-?({$number}|\(\\s*(?R)\\s*\)|{$func}))";
38
+
39
+ $expression = "(?>\\s*$factor(\\s*[\+\-\*\/%]\\s*$factor)*\\s*)";
40
+
41
+ $pattern = "/{$expression}/";
42
+
43
+ $input = "-12.5 + ((37+2) * -5) ++ pow(2, 3)";
44
+
45
+ if (preg_match($pattern, $input, $match) == 1 && $match[0] === $input)
46
+
47
+ {
48
+
49
+ echo "success";
50
+
51
+ }
52
+
53
+ else
54
+
55
+ {
56
+
57
+ echo "failed";
58
+
59
+ }
60
+
61
+ ```
62
+
63
+

2

追記

2017/02/21 07:13

投稿

Zuishin
Zuishin

スコア28660

test CHANGED
@@ -1,3 +1,11 @@
1
1
  [token_get_all](http://php.net/manual/ja/function.token-get-all.php) を使ってトークンを求め、そのうち数式以外のものが入っていたらエラーを出すことでセキュリティー問題は解決可能だと思います。
2
2
 
3
3
  さらに [php_check_syntax](http://jp2.php.net/manual/ja/function.php-check-syntax.php#77318) を使えばシンタックスエラーをチェックできます。
4
+
5
+
6
+
7
+ 追記
8
+
9
+
10
+
11
+ 失礼しました。php_check_syntax は廃止されていますね。私なら正規表現を使うか独自に構文解析を作ります。数式に限定されているので、得られたトークンをもとに構文解析したとしてもそれほど大げさなことにはなりそうもない気もしますが、正規表現の方が楽かもしれませんね。

1

マークダウン修正

2017/02/20 23:12

投稿

Zuishin
Zuishin

スコア28660

test CHANGED
@@ -1,3 +1,3 @@
1
- (token_get_all)[http://php.net/manual/ja/function.token-get-all.php] を使ってトークンを求め、そのうち数式以外のものが入っていたらエラーを出すことでセキュリティー問題は解決可能だと思います。
1
+ [token_get_all](http://php.net/manual/ja/function.token-get-all.php) を使ってトークンを求め、そのうち数式以外のものが入っていたらエラーを出すことでセキュリティー問題は解決可能だと思います。
2
2
 
3
- さらに (php_check_syntax)[http://jp2.php.net/manual/ja/function.php-check-syntax.php#77318] を使えばシンタックスエラーをチェックできます。
3
+ さらに [php_check_syntax](http://jp2.php.net/manual/ja/function.php-check-syntax.php#77318) を使えばシンタックスエラーをチェックできます。