请问这个替换内容怎么写正则表达式?

2015-08-06 08:17:41 +08:00
 CNCCTV
一个php配置文件的内容
<?php
$title='nihao';
$content1='<b style="color:red;">欢迎!</b>
<a href="reg.php" class="btn">注册</a>
<a href="login.php" class="btn">登录</a>';
$content2='站点暂时关闭
开放时间未知';
?>
content1和content2里的内容都是换行的。
第一个变我量能替换内容,但是第二个变量就出问题了。请问怎么写正这个则表达式啊?
2997 次点击
所在节点    PHP
25 条回复
loveyu
2015-08-06 08:25:58 +08:00
你要替换什么内容
popok
2015-08-06 08:33:13 +08:00
问题描述清楚些
realpg
2015-08-06 08:33:31 +08:00
whisperer
2015-08-06 08:40:47 +08:00
匹配换行符?
sciooga
2015-08-06 10:07:14 +08:00
不要使用 小数点 表示任何字符,使用[\S\s] 表示任何字符,这样不会受跨行影响。
neoFaster
2015-08-06 11:52:11 +08:00
先把问题写清楚,语句通顺怎么先得做到吧。
fox0001
2015-08-06 13:39:17 +08:00
正则表达式加m和s结尾,m表示匹配多行,s表示.号匹配h换行符
CNCCTV
2015-08-06 15:04:21 +08:00
@loveyu @popok @whisperer @sciooga @neoFaster @fox0001
我是想把单引号中的内容替换,
我用的方法是把变量作为匹配开始的字段。
<?php
//接收提交的变量名
$name=$_POST['name'];
//接收提交的内容
$new_content=$_POST['new_content'];
//判断是否有这个文件
$file_path="config.php";
if(file_exists($file_path)){
if($fp=fopen($file_path,"a+")){
//读取文件
$conn=fread($fp,filesize($file_path));
//替换字符串,把内容替换成$new_content的内容。
$conn=preg_replace('/'.$name.'=\'?.+\';/im',
$name.'=\''.$new_content.'\';',
$conn);
// 保存修改结果。
file_put_contents($file_path, $conn);
// 关闭资源
fclose($fp);
}
}else{
echo "没有这个文件";
}
?>
但是换行的内容替换不了。
popok
2015-08-06 15:18:26 +08:00
. 匹配除换行符以外的任意字符

所以换行符是匹配不到的,正如5楼说的,换[\s\S]或[\w\W]都行,比如?.+换成[\w\W]+
popok
2015-08-06 15:21:56 +08:00
哦,上面那个title匹配过多了,应该是勉强模式重复,应该是这个[\w\W]*?
popok
2015-08-06 15:23:25 +08:00
$conn=preg_replace('/'.$name.'=\'[\w\W]*?\';/im',
$name.'=\''.$new_content.'\';',
$conn);
CNCCTV
2015-08-06 15:24:07 +08:00
@popok 不行啊,会把下一个变量和单引号中的内容也覆盖了。
CNCCTV
2015-08-06 15:27:34 +08:00
@popok 11楼的方法是可以的
ellipse42
2015-08-06 15:32:35 +08:00
CNCCTV
2015-08-06 15:35:25 +08:00
@popok 还有一个问题,如果提交的内容有单引号,怎么去处理?难度又用正则替换吗?
feiyuanqiu
2015-08-06 15:37:55 +08:00
我大概看懂了需求了,意思是想根据输入的属性名替换属性值?比如输入是 $name = 'href'; $new_content = 'test'
就把 config.php 改为 $content1='<b style="color:red;">欢迎!</b>
<a href="test" class="btn">注册</a>
<a href="test" class="btn">登录</a>';

如果是这样的话,把正则改一下就行了

$reg = '/(' . $name . ')="([^"]*)"/sim';
$conn = preg_replace($reg, '${1}="'.$new_content.'"', $content1);
CNCCTV
2015-08-06 15:52:08 +08:00
@feiyuanqiu 是以变量名称作为匹配开始的字段,再以';作为结束,如$title='';,然后把单引号中的内容替换。
CNCCTV
2015-08-06 15:53:24 +08:00
@feiyuanqiu 而有些内容会有换行的。
feiyuanqiu
2015-08-06 16:01:18 +08:00
@CNCCTV 哦,懂了
既然config.php是php文件,你为什么不 include 进来直接改变量值就行了嘛?

$content = file_get_contents('config.php');

$search = '\$content2';
$replace = 'test';
$reg = '/(' . $search . ')=\'([^\']*)\'/sim';
$replaced = preg_replace($reg, '${1}=\''.$replace.'\'', $content);
CNCCTV
2015-08-06 16:08:16 +08:00
@feiyuanqiu 是因为想做成后台修改配置,也可以做成安装配置用,而不是上FTP去修改文件。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/211124

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX