2014-01-17 57 views
1

我使用preg_match()函數來確定函數是否被執行。使用preg_match()連接正則表達式字符串中的變量

if(preg_match('/^([0-9]+,){0,3}[0-9]+$/', $string)) { ... } 

但是我必須使用整型變量,它在正則表達式整合:

$integer = 4; 
if(preg_match('/^([0-9]+,){0,' . $integer . '}[0-9]+$/', $string)) { ... } 

,但它並沒有當它應該相匹配。我不能連接正則表達式字符串中的變量嗎?

編輯:

strval($integer)已經解決了我的問題。我不得不把整數值轉換成字符串連接時之前(雖然我不明白爲什麼):

$integer = 4; 
if(preg_match('/^([0-9]+,){0,' . strval($integer) . '}[0-9]+$/', $string)) { ... } 

回答

1

每當串聯變量爲正則表達式,你應該通過變量傳遞給the preg_quote function這樣做。

但是,如果變量var與您的示例4中的值相同,則不會有任何區別。您正在使用的模式將是:

/^([0-9]+,){0,4}[0-9]+$/ 

在這種情況下,如果它不工作:檢查$string值,並確保的模式相匹配。順便說一句,/^(\d+,){,4}\d+$/更短,並做同樣的事情。

調用strval不能解決任何問題,據我所知......我測試過的代碼而不strval,使用下面的代碼片段:

$string = '1234,32'; 
if (preg_match('/^([0-9]+,){0,4}[0-9]+$/', $string)) 
{ 
    echo 'matches',PHP_EOL; 
    $count = 4; 
    if (preg_match('/^([0-9]+,){0,'.$count.'}[0-9]+$/', $string)) 
     echo 'matches, too',PHP_EOL; 
} 

的產量,如我所料:

matches 
matches, too 

在你的情況,我會簡單地寫:

$count = 4; 
preg_match('/^(\d+,){,'.preg_quote($count, '/').'}\d+$/', $string); 

這是無可否認比僅僅調用strval更安全,因爲你沒有考慮到可能的特殊正則表達式字符(+[]{}/\$^?!:<=*.之類)

+0

我發現了這個問題。我發佈了一個答案。無論如何謝謝 – Manolo

+0

@ManoloSalsas:我不認爲你做到了。爲什麼我不相信'strval'是我的答案的答案,以及爲什麼'strval',即使它解決問題不應該被信任 –

相關問題