1

ウィキペディアのアカウントに「リンク」されているニックネームを保存するためにデータベースを使用するPHPIRCボットのモジュールを作成しました。これを行うために、私は次のコードを持っています:

$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ですが、これは別の話です)の内容はここにありますここで完全なコードを確認することもできます。

このコンテキストでは、変数$ ex [4]は、次のようにIRCから使用される%nasコマンドに渡される引数を意味します%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)VeranoI\(L\)Verano

あなたは私が間違っていることを私に話すのを本当に助けてくれるでしょう。ああ、ここで見たたくさんのコードを試してみました。それらを混ぜてみました...おそらく問題はp_chars関数とdp_chars関数にありますか?でも見えない!

4

1 に答える 1

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)
于 2012-12-19T20:30:44.197 に答える