2012-03-17 25 views
5

Tôi đang cố gắng tìm cách tốt nhất để thực hiện việc này. Về cơ bản tôi được cung cấp các chuỗi giống như thế này với nhiệm vụ in ra chuỗi ký tự được phân tích cú pháp.PHP - Phân tích phương trình toán học bên trong các chuỗi

Jack có [0.8 * 100]% cơ hội vượt qua bài kiểm tra. Katie có cơ hội [(0.25 + 0.1) * 100]%.

Phương trình toán học luôn được đóng gói bằng dấu ngoặc vuông. Tại sao tôi đối phó với các chuỗi như thế này là một câu chuyện dài, nhưng tôi thực sự đánh giá cao sự giúp đỡ!

+0

preg_match_all + eval + str_replace (hoặc với preg_replace_callback) ... theo thứ tự đó. nhưng được cảnh báo, eval có thể nguy hiểm, không chỉ khớp trên [] hoặc ai đó có thể thêm mã vào []. – Rufinus

+0

Bạn có thể 'eval()' báo cáo, đó là một nguy cơ bảo mật mặc dù. – Robus

Trả lời

2
preg_match_all('/\[(.*?)\]/', $string, $out); 
foreach ($out[1] as $k => $v) 
{ 
    eval("\$result = $v;"); 
    $string = str_replace($out[0][$k], $result, $string); 
} 

Mã này là cao nguy hiểm nếu các chuỗi là đầu vào người sử dụng vì nó cho phép bất kỳ mã tùy ý để được thực thi

+0

Không có đầu vào của người dùng để hoạt động tốt. Cảm ơn người đàn ông! – user949738

-2

Âm thanh, như bài tập về nhà của bạn .... nhưng bất kỳ điều gì.

Bạn cần sử dụng thao tác chuỗi php có rất nhiều chức năng được tích hợp sẵn để bạn may mắn. Kiểm tra hàm explode() cho chắc chắn và str_split().

Dưới đây là một danh sách đầy đủ các chức năng cụ thể liên quan đến chuỗi: http://www.w3schools.com/php/php_ref_string.asp

Good Luck.

+0

Không phải bài tập về nhà ... có lẽ bạn có ấn tượng đó từ ví dụ hư cấu của tôi? explode() là một ý tưởng khá sơ sài. – user949738

3

Có rất nhiều thư viện thẩm toán cho PHP. Tìm kiếm trên web nhanh chóng bật lên this one.


Viết phân tích cú pháp riêng của bạn cũng là một lựa chọn, và nếu nó chỉ là số học cơ bản nó không nên quá khó khăn. Với các nguồn tài nguyên ngoài kia, tôi sẽ tránh xa điều này.


Bạn có thể mất một cách tiếp cận đơn giản và sử dụng eval. Hãy cẩn thận để khử trùng đầu vào của bạn trước. Trên eval docs's page, có các nhận xét có mã để thực hiện điều đó. Dưới đây là một ví dụ:

Tuyên bố từ chối trách nhiệm: Tôi biết eval chỉ là lỗi chính tả của điều ác, và đó là một điều kinh khủng khủng khiếp và tất cả những điều đó. Nếu được sử dụng đúng, nó có sử dụng, mặc dù.

<?php 

$test = '2+3*pi'; 

// Remove whitespaces 
$test = preg_replace('/\s+/', '', $test); 

$number = '(?:\d+(?:[,.]\d+)?|pi|π)'; // What is a number 
$functions = '(?:sinh?|cosh?|tanh?|abs|acosh?|asinh?|atanh?|exp|log10|deg2rad|rad2deg|sqrt|ceil|floor|round)'; // Allowed PHP functions 
$operators = '[+\/*\^%-]'; // Allowed math operators 
$regexp = '/^(('.$number.'|'.$functions.'\s*\((?1)+\)|\((?1)+\))(?:'.$operators.'(?2))?)+$/'; // Final regexp, heavily using recursive patterns 

if (preg_match($regexp, $q)) 
{ 
    $test = preg_replace('!pi|π!', 'pi()', $test); // Replace pi with pi function 
    eval('$result = '.$test.';'); 
} 
else 
{ 
    $result = false; 
} 

?> 
+0

Tôi đồng ý ngoại trừ mẫu mã eval (không hoạt động đối với tôi). – davidmars

0

Phương pháp eval được cập nhật từ ví dụ về tài liệu PHP.

<?php 
function calc($equation) 
{ 
    // Remove whitespaces 
    $equation = preg_replace('/\s+/', '', $equation); 
    echo "$equation\n"; 

    $number = '((?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?|pi|π)'; // What is a number 

    $functions = '(?:sinh?|cosh?|tanh?|acosh?|asinh?|atanh?|exp|log(10)?|deg2rad|rad2deg|sqrt|pow|abs|intval|ceil|floor|round|(mt_)?rand|gmp_fact)'; // Allowed PHP functions 
    $operators = '[\/*\^\+-,]'; // Allowed math operators 
    $regexp = '/^([+-]?('.$number.'|'.$functions.'\s*\((?1)+\)|\((?1)+\))(?:'.$operators.'(?1))?)+$/'; // Final regexp, heavily using recursive patterns 

    if (preg_match($regexp, $equation)) 
    { 
     $equation = preg_replace('!pi|π!', 'pi()', $equation); // Replace pi with pi function 
     echo "$equation\n"; 
     eval('$result = '.$equation.';'); 
    } 
    else 
    { 
     $result = false; 
    } 
    return $result; 
} 
?> 
Các vấn đề liên quan