PHP不使用特殊字符替换行
我已经为一个PHPIRC机器人编写了一个模块,它使用一个数据库来保存链接到维基百科帐户的刻痕。为此,我有以下代码: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;
$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?再三感谢!看见谈论所有的符号