2012-10-29 22 views
1

我試圖創建一個測驗系統。我有這個數據庫中的表:如何在我的測驗系統中正確使用php中的preg_replace函數

CREATE TABLE fill_gap_exercise (
    quiz_id INT PRIMARY KEY, 
    text VARCHAR, 
    wordslist VARCHAR, 
    date DATETIME 
) 

這裏是從表中的示例數據行:

INSERT INTO fill_gap_exercise 
    (quiz_id, text, wordslist, date) 
VALUES 
    (4, 'hello {0} up {1}', 'a:2:{i:0;s:5:"whats";i:1;s:5:"men??";}', '2012-10-29 13:24:25') 

我試圖在text領域內更換{}人物,但我有一個問題,當句子有多次出現的序列時{}

這裏是我的代碼:

<?php 

    include('../connect_db.php'); 

    $myData = mysql_query('SELECT * FROM fill_gap_exercise'); 

    while ($row = mysql_fetch_array($myData, MYSQL_ASSOC)) 
    {  

    $array = unserialize($row['wordslist']); 
    $text = implode('\r\n', $array); 

    echo "\n<br />"; 

    $pattern = '/\{(.*)\}/'; 
    $replace = '<input type="text" name="j_1" id="' . $row["quiz_id"] . '" />'; 
    $subject = $row['text']; 
    $string = preg_replace($pattern, $replace, $subject); 

    print $string;  
    }  
+1

而且你的問題是什麼?什麼不行?你有沒有看到任何錯誤? – hakre

+0

歡迎來到Stack Overflow! [**請不要在新代碼中使用'mysql_ *'函數**](http://bit.ly/phpmsql)。他們不再被維護,[棄用過程](http://j.mp/Rj2iVR)已經開始。看到[**紅框**](http://j.mp/Te9zIL)?學習[*準備的語句*](http://j.mp/T9hLWi),並使用[PDO](http://php.net/pdo)或[MySQLi](http://php.net/ mysqli) - [這篇文章](http://j.mp/QEx8IB)將幫助你決定哪個。如果你選擇PDO,[這裏是一個很好的教程](http://j.mp/PoWehJ)。 –

+1

請不要在這樣的關係數據庫中存儲序列化爲字符串的數據。使用'quiz_words'表來維持關係,這將使許多事情變得更容易。 – DaveRandom

回答

3

使用Lazy quantificator

更換'/\{(.*)\}/''/\{(.*?)\}/'

+0

好吧,我需要!非常感謝!還有一個問題。我需要關於驗證的幫助。當用戶寫出適當的單詞時,我該如何檢查這個答案是否正確? –

+0

我假設可以有幾個詞。獲取正確的單詞並將它們放在一個數組中,然後爲提交的單詞創建另一個數組,並使用http://www.php.net/manual/en/function.array-diff.php –

+0

在我的案例中有字段單詞列表包含正確的話..我對如何做到這一點感到困惑 –

0

你很可能需要的位置計數器無論如何,所以爲什麼不能簡單地從串取呢?自動消除greedy/non-greedy問題。

E.g.

<?php 
$row = array("quiz_id"=>47); 
$string = 'hello {0}, up {1}?'; 

$string = preg_replace('/{(\d+)}/', '<input type="text" name="q['.$row["quiz_id"].'][\\1]" />', $string); 

echo $string; 

打印

hello <input type="text" name="q[47][0]" />, up <input type="text" name="q[47][1]" />? 
+0

這使我困惑,因爲我沒有太多的經驗..我有很多行..我怎麼可以在我的自定義這?另外,我有問題後如何做驗證,任何想法?不幸的是,我是新的,我有這個問題的問題.. –