PHP不使用特殊字符替换行

PHP不使用特殊字符替换行,php,Php,我已经为一个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;

我已经为一个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_字符
函数与
dp_字符
一起,是一个自定义函数,用于向某些特殊字符添加或删除反斜杠:

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]表示传递给%nas命令的参数,该命令从IRC中使用,如下所示:
%nas Test

调用该命令时,它会在文件中搜索以
$ex[4]开头的行。“~!”
。我使用
~作为分隔符。例如,如果命令参数是
%nas Testing
,它将搜索
Testing~。如果找到该行,它将用自身的plus
“~!”$mask[0]
替换它
$mask[0]
是调用该命令的用户的昵称

如果找不到该行,它将按照以下结构添加一个新行:
$ex[4]~$掩码[0]
。例如,如果Bousie做了
%nas测试
,它将搜索
测试~。假设该行是
Testing~!测试
,它将替换为
测试~!测试~!布西
。否则,它会添加一行
Testing~!布西

问题是,如果Bousie做了
%nas unrr
,它会正常工作。但如果布西真的做了
%nas I(L)Verano
,它会添加一个新行。但是已经有I(L)Verano线了。请注意,在对其进行讽刺之前,应该将
I(L)Verano
参数转换为
I\(L\)Verano
,因此我不知道我在这段代码上做错了什么

你真的会帮我告诉我我做错了什么。哦,我试着用我在这里看到的很多代码,我试着把它们混合起来。。。也许问题出在p_chars和dp_chars函数上?不过我看不见

你所需要的就是

$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)
之后

你所需要的只是

$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)
之后


谢谢,谢谢,谢谢!它工作得很好。您可以在这里看到我是如何在代码中修改它的:再次感谢!尽管如此,我还是有一个问题:为什么
。。。作为$k=>和$line
?为什么是&$line?再三感谢!看见谈论所有的符号谢谢,谢谢,谢谢!它工作得很好。您可以在这里看到我是如何在代码中修改它的:再次感谢!尽管如此,我还是有一个问题:为什么
。。。作为$k=>和$line
?为什么是&$line?再三感谢!看见谈论所有的符号