我为PHP IRC机器人编写了一个模块,该模块使用数据库来保存哪些缺刻与维基百科帐户“链接”。为此,我有以下代码:
$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~!
。如果它找到了该行,则将其替换为 plus "~!".$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函数上?但是我看不到它!
答案 0 :(得分: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)