teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

微修正

2017/02/21 07:27

投稿

Zuishin
Zuishin

スコア28675

answer CHANGED
@@ -14,10 +14,10 @@
14
14
  ```PHP
15
15
  <?php
16
16
  $number = "(\\d+(\\.\\d+)?)";
17
- $pow = "(pow\\((?R),\\s*(?R)\\))";
17
+ $pow = "(pow\\((?R),(?R)\\))";
18
18
  $func = "{$pow}";
19
19
  $factor = "(-?({$number}|\(\\s*(?R)\\s*\)|{$func}))";
20
- $expression = "(?>\\s*$factor(\\s*[\+\-\*\/%]\\s*$factor)*\\s*)";
20
+ $expression = "(?>\\s*{$factor}(\\s*[\\+\\-\\*\\/\\%]\\s*{$factor})*\\s*)";
21
21
  $pattern = "/{$expression}/";
22
22
  $input = "-12.5 + ((37+2) * -5) ++ pow(2, 3)";
23
23
  if (preg_match($pattern, $input, $match) == 1 && $match[0] === $input)
@@ -29,3 +29,7 @@
29
29
  echo "failed";
30
30
  }
31
31
  ```
32
+
33
+ 追記
34
+
35
+ ちょっと修正を入れました。

3

追記

2017/02/21 07:27

投稿

Zuishin
Zuishin

スコア28675

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

2

追記

2017/02/21 07:13

投稿

Zuishin
Zuishin

スコア28675

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

1

マークダウン修正

2017/02/20 23:12

投稿

Zuishin
Zuishin

スコア28675

answer CHANGED
@@ -1,2 +1,2 @@
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
- さらに (php_check_syntax)[http://jp2.php.net/manual/ja/function.php-check-syntax.php#77318] を使えばシンタックスエラーをチェックできます。
2
+ さらに [php_check_syntax](http://jp2.php.net/manual/ja/function.php-check-syntax.php#77318) を使えばシンタックスエラーをチェックできます。