带有变量输入的preg_replace

时间:2015-07-26 23:27:40

标签: 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 update
$content = preg_replace('/\$yourname = \"(.*?)\";/', '$yourname = ""$YN"";', $content);


        /*write operation ->*/ $tmp =fopen($fl, "w");    fwrite($tmp, $content);    fclose($tmp);
?>

我正在尝试更新与$ yourname匹配的配置文件条目和POST结果,我可以回显$ yn并且它包含正确的值,但我无法让变量在正则表达式替换中工作,

$content = preg_replace('/\$yourname = \"(.*?)\";/', '$yourname = ""$yn"";', $content);

所以如果$ yn = karl那么我试图将文件中的$ yourname =“”更新为$ yourname =“karl”

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

希望有人可以提供帮助

2 个答案:

答案 0 :(得分:0)

使用您发布的内容我设法让它工作,非常感谢您:)

$content =   preg_replace( '/\$yourname = \"(.*?)\";/', '$yourname = "'.$yn.'";', $content);

答案 1 :(得分:-1)

我建议使用这样的模式

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

..&#39; \ S * = \ S * \&#34;([^ \&#34;] +)\&#34 ;;

  • preg_quote($ yourname) - 转义变量输入(文字匹配)
  • \ s * - 一个或多个空格
  • = - literal(=)
  • \ s * - 一个或多个空格
  • \&#34; - 文字(&#34;)
  • [^ \&#34;] + - 尽可能多次匹配任何不是(&#34;)贪婪匹配的字符。
  • \&#34; - 文字(&#34;)
  • ;文字(;)

在这种情况下(因为它使用双引号),它(谨慎?)更好地使用连接并避免逃避它的头痛。当简单性赢得胜利时,无需fancy

同时要警惕像php {变种名称} $yn vs $YN这样的错误是区分大小写的,如果没有这些知识,它可能是找到错误的主要挑战,因为对我们这些人来说它看起来像相同。当然,文件名,类名,函数和方法不区分大小写(在Windows上)并没有帮助。真的不确定类和方法名称在linux上是否区分大小写,我尽量避免这个问题,并且总是使用相同的大小写。

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

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

https://regex101.com/r/yM9cX9/1