2016-03-26 15 views
0

Bir dizenin matematiksel bir ifadeyi temsil edip etmediğini kontrol etmek için bir PHP işlevi yazmaya çalışıyorum. Ben bu olasılıklar ile test ediyorumPHP Bir dizenin matematiksel bir ifade olduğunu doğrulayın

function is_math($maybe_math){ 
    $pattern = '([-+]?[0-9]*\.?[0-9]+[\/\+\-\*])+([-+]?[0-9]*\.?[0-9])'; 
    if(0 === preg_match($maybe_math, $pattern)){ 
     return true; 
    } 
} 

:

$valid = is_math('(1-4*(9*5/1)+1)'); //true 
$invalid = is_math('hats' ); //false 
$valid_and_invalid = is_math('(1-4aaa*(9*5/1)+1k)'); //true 

Gördüğünüz gibi, şimdiye kadar matematiksel bir ifade için de geçerlidir değerlendirir veya bir dize ile

Bu

ben ne var geçerli matematik karakterleri ve geçersiz matematik karakterleri. Şu anda gösterdiğim üçüncü test yanlış olmalı, çünkü harflerin içinde harfler var ve ben burada cebir yapmıyorum.

Buradaki amacım, dizelerimin değerlendirmeye iletilebildiğini ve bir numaranın geri alınabileceğini ve güvenli olmayan kodun yürütülmesini riske atmayacağımı doğrulamak için kullanabileceğim bir işlev oluşturmaktır; çünkü bu sayılar kısmen POST verilerinden gelir.

+0

Şimdi sorun ne? – Rizier123

+2

Olası kopyası [Matematik ifadesini normal ifadeyle eşleştirme?] (Http://stackoverflow.com/questions/2595254/matching-math-expression-with-regular-expression). Php çözümü ile yanıtı kontrol edin: http://stackoverflow.com/a/2596378/2253302 –

+0

php eval işlevini kullanın ve evet bu soru çift kopyalayın – Saleem

cevap

0

Birincil sorun, yalnızca tüm ifade yerine olası en küçük eşleşen alt dizeye bakmanızdır.

Bu ifadelerle eşleştirilebilen see for yourself yapabilirsiniz.

İlk adım, izin verilen karakter tam set (örneğin, ( veya ) için eşleşme var) içerir (sırasıyla ^ ve $), başlangıç ​​ve bitiş maçlarda ifadesini sarın ve oradan gitmek olurdu .

Ama gerçekten, bu bir aptalın işi. Normal ifadeler matematiksel ifadeleri ayrıştırmak için tasarlanmamıştır; Bu alıştırmanın öğrenme değeri var, ama sonuçta iyi bir şekilde yapılamaz.

İlgili konular