Php preg_替换为变量输入

Php preg_替换为变量输入,php,regex,Php,Regex,我对这一点很陌生,从另一篇文章中借用了一些代码,我不知道我想做的是正确的还是最好的方法,这只是我如何“让”它工作 这是密码 <?php $yn = $_POST['YN']; echo $yn; $fl='config.php'; /*read operation ->*/ $tmp = fopen($fl, "r"); $content=fread($tmp,filesize($fl)); fclose($tmp); // here goes your up

我对这一点很陌生,从另一篇文章中借用了一些代码,我不知道我想做的是正确的还是最好的方法,这只是我如何“让”它工作

这是密码

<?php
$yn = $_POST['YN'];
echo $yn;
$fl='config.php'; 
        /*read operation ->*/ $tmp = fopen($fl, "r");   $content=fread($tmp,filesize($fl)); fclose($tmp);

// here goes your update
$content = preg_replace('/\$yourname = \"(.*?)\";/', '$yourname = ""$YN"";', $content);


        /*write operation ->*/ $tmp =fopen($fl, "w");    fwrite($tmp, $content);    fclose($tmp);
?>
因此,如果$yn=karl,那么我会尝试将文件中的$yourname=“”更新为$yourname=“karl”

但我无法让它工作,最接近我得到的是用变量作为文本更新文件,即$yourname=“$yn”


希望有人能帮忙

我建议使用这样的模式

     preg_replace( '/'.preg_quote( $yourname ).'\s*=\s*\"[^\"]+\";/', $yourname.'="'.$yn.'";', $content);
..“\s*=\s*\”([^\“]+)\”

  • preg_quote($yourname)-转义变量输入(文字匹配)
  • \s*-一个或多个空格
  • =-文字(=)
  • \s*-一个或多个空间
  • \“-literal(”)
  • [^\“]+-尽可能多次匹配任何非(“)贪婪匹配的字符
  • \“-literal(”)
  • ;文字(;)
在这种情况下(因为它使用双引号),最好(谨慎地?)使用串联,省去逃避它的麻烦。当简单性赢得胜利时,不需要花哨

还要注意php变量名中的
$yn
$yn
之类的错误是区分大小写的,如果不知道这一点,查找错误可能是一个重大挑战,因为对我们人类来说,它看起来是一样的。当然,文件名、类名、函数和方法不区分大小写(在Windows上)也没有帮助。我真的不确定linux上的类和方法名是否区分大小写,我试图避免这个问题,并始终使用相同的大小写

由于看起来OP可能需要
$yourname
(字面意思)我更新了regx

 preg_replace( '/\$yourname\s*=\s*\"[^\"]+\";/', '$yourname="'.$yn.'";', $content);

使用您发布的内容,我成功地让它工作了,非常感谢:)


如果删除双精度“about$yn”以便只有“$yn”,那么它会工作吗?首先,单精度
不能用于php中的变量插值。这意味着它是字面意义上的,而不是价值。为了显示变量值,必须使用
双引号或串联
'words”。$foo
变量(如
$YN
)不会在单引号中插入(无论其中是否出现额外的双引号错误).--这可能是不相关的,希望不是一个安全关键方面,但对于PHP上下文使用的文本值的正确编码来说。我还建议在任何正则表达式中使用
preg_quote($var)
,以正确转义特殊字符。使用名称可以,但类似
[
在regx'soh中有特殊意义,你是指字面意义的
$yourname
还是它的值?是的$yourname应该是$yourname,而$yn是变量值,我设法得到了我想要的工作,非常感谢你的帮助:)
 preg_replace( '/\$yourname\s*=\s*\"[^\"]+\";/', '$yourname="'.$yn.'";', $content);
$content =   preg_replace( '/\$yourname = \"(.*?)\";/', '$yourname = "'.$yn.'";', $content);