2012-12-19 165 views
1

我已經爲PHP IRC bot編寫了一個模塊,該模塊使用數據庫來保存哪些刻度與維基百科帳戶「鏈接」。要做到這一點,我有以下代碼:PHP不會替換特殊字符行

$pudb_wnas = file('cache.ucb'); 
foreach ($pudb_wnas as $lineNumber => $line) { 
    if (preg_match("/" . p_chars($ex[4]) . "~!/i", $line) != false) { 
     $found = true; 
     break; 
    } 
} 
if ($found) { 
    echo "!!!!!!!!!!!!!!!!FOUND!!!!!!!!!!!!!!!!!!\n"; 
    $lines = file('cache.ucb', FILE_IGNORE_NEW_LINES); 
    $wnas_bu = $lines[$lineNumber];                                    
    $lines[$lineNumber] = trim($wnas_bu) . "~!" . $mask[0];                              
    file_put_contents('cache.ucb', implode("\n", $lines));                              
} else { 
    $udb_wnas = fopen("cache.ucb", "a+"); 
    fwrite($udb_wnas, "\n" . p_chars($ex[4]) . "~!" . $mask[0]); 
    fclose($udb_wnas); 
} 

p_chars功能,旁邊有dp_chars,是一個自定義功能來添加或刪除反斜槓一些特殊字符:

function p_chars($text) { 
    $m_text = str_replace("(", "\(", $text); 
    $m_text = str_replace(")", "\)", $m_text); 
    return $m_text; 
} 

// Función para descodificar p_chars 
function dp_chars($text) { 
    $m_text = str_replace("\(", "(", $text); 
    $m_text = str_replace("\)", ")", $m_text); 
    return $m_text; 
} 

的cache.ucb文件(這真的是nas.udb,但這是另一個故事)內容位於here。您也可以看到完整的代碼here

變量$ ex [4]在此上下文中表示傳遞給%nas命令的參數,該命令在IRC中使用,如下所示:%nas Test

當您調用該命令時,它會在cache.ucb文件中搜索以$ex[4]."~!"開頭的行。我使用~!作爲分隔符。例如,如果命令參數是%nas Testing,它會搜索Testing~!。如果它找到了這條線,它會自己替換它加上"~!".$mask[0]$mask[0]是調用該命令的用戶的暱稱。

如果找不到該行,則會按照此結構添加一個新行:$ex[4]~!$mask[0]。因此,作爲例子,如果Bousie做了%nas Testing,它會搜索Testing~!。假設該行是Testing~!Test,它將用Testing~!Test~!Bousie代替它。否則,它會添加行Testing~!Bousie

問題是,如果Bousie做了%nas UnRar,它會正常工作。但如果Bousie做了%nas I(L)Verano,它會添加一條新線。但已經有I(L)Verano系列。請注意,應該轉換之前I(L)Verano參數I\(L\)Verano,所以我不知道我在做這個代碼錯了什麼。

你真的會幫我告訴我我做錯了什麼。哦,我嘗試了很多我在這裏看到的代碼,我嘗試過將它們混合在一起......也許問題出在p_chars和dp_chars函數上?不過,我看不到它!

回答

1

所有你需要的是

$file = "cache.ucb"; 
$ex[4] = "I\(L\)Verano"; 
$nick = "Bousie"; 
$pudb_wnas = file($file, FILE_IGNORE_NEW_LINES); 

var_dump($pudb_wnas); // before 
foreach ($pudb_wnas as $k => &$line) { 
    preg_match(sprintf("/^%s~/", preg_quote($ex[4])), $line) and $line = sprintf("%s~!%s", $line, $nick); 
} 
var_dump($pudb_wnas); // after 
file_put_contents($file, implode(PHP_EOL, $pudb_wnas)); 

之前

array (size=4) 
    0 => string 'UnRar~!Catbuntu' (length=15) 
    1 => string 'MistrX~!MRX' (length=11) 
    2 => string 'I\(L\)Verano~!ILVerano' (length=22) 
    3 => &string '-jem-~!jem-' (length=11) 

array (size=4) 
    0 => string 'UnRar~!Catbuntu' (length=15) 
    1 => string 'MistrX~!MRX' (length=11) 
    2 => string 'I\(L\)Verano~!ILVerano~!Bousie' (length=30) // works perfectly 
    3 => &string '-jem-~!jem-' (length=11) 
+0

三江源,三江源,三江源!它完美的作品。你可以看看我是如何在我的代碼中調整它的:https://github.com/unrar/unbot/blob/master/sybil.php再次感謝!雖然,我有一個問題:爲什麼......作爲$ k =>&$ line'?爲什麼是&$ line?再次感謝,並再次! –

+0

請參閱http://stackoverflow.com/questions/3737139/reference-what-does-this-symbol-mean-in-php ..討論所有符號 – Baba