2012-12-19 117 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