回答編集履歴
4
微修正
test
CHANGED
@@ -30,13 +30,13 @@
|
|
30
30
|
|
31
31
|
$number = "(\\d+(\\.\\d+)?)";
|
32
32
|
|
33
|
-
$pow = "(pow\\((?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
追記
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
追記
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
マークダウン修正
test
CHANGED
@@ -1,3 +1,3 @@
|
|
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) を使えばシンタックスエラーをチェックできます。
|