php中 用preg_replace替换config.php中的数组并赋值

本文详细介绍了如何在config.php文件中替换base_url配置项,包括使用正则表达式和PHP语法进行操作。适用于PHP开发者的日常维护和部署。

config.php中的内容如下:

$config['base_url'] = 'http://localhost/';

要替换为:

$config['base_url'] = '192.168.0.102';

可以看到,需要替换的只是等号后的内容,而替换的条件是config的key即base_url相同

替换语句为:其中$ini="base_url"  $value="192.168.0.102"   

 $str2 = preg_replace("/\\\$config\['".$ini."']\s*=\s*'(.*)';/","\$config['".$ini."'] = '".$value."';",$str);

这里需要有几点说明:

1、preg_replace的第一参数为正则表达式,第二参数是普通字符串。

2、\\\$:因为$在这里是表示php的变量,而不是表达式的结束,所以需要转义。我个人理解,需要三个"\"的原因是php解析时经过两个过程,一、正则表达式规则,二、php本身的解析

3、\\\$可以用[$]来代替

4、[ 需要转义,] ' 不需要转义

5、等号两边有空格,或者没有,所以空格用\s*来表示。

6、第二个参数中的$也需要转义,因为是在字符串中。



function hqh_cj_gongju_detection_words($content, $type=null) { global $zbp, $zbp_Config_hqh_cj_gongju; $filtration = ' ,|。|;| <|>|(|)|【|】 '; // 缓存配置值 $apiLinks = $zbp_Config_hqh_cj_gongju->hqh_contentMasking_APILinks; $apiToken = $zbp_Config_hqh_cj_gongju->hqh_contentMasking_APIToken; $apiTime = $zbp_Config_hqh_cj_gongju->hqh_contentMasking_APITime ?: 86400; $apiRefresh = $zbp_Config_hqh_cj_gongju->hqh_contentMasking_APIRefresh; $apiType = $zbp_Config_hqh_cj_gongju->hqh_contentMasking_APIType; // 获取API数据 $data_API1 = ''; if($zbp_Config_hqh_cj_gongju->hqh_swords_blocking_off == 1){ $data_Local = ($apiType == '1' ? '' : $zbp_Config_hqh_cj_gongju->hqh_swords_blocking); $data_remote = ($apiType == '-1' ? '' : hqh_cj_gongju_APIGetData('GetFilterWords', $apiLinks, $apiToken, 'Config', 'hqh_swords_blocking', null, $apiTime, $apiRefresh, $apiType)); $data_API1 = $data_remote . '|' . $data_Local; } $data_API2 = ''; if($zbp_Config_hqh_cj_gongju->hqh_swords_blocking2_off == 1){ $data_Local2 = ($apiType == '1' ? '' : $zbp_Config_hqh_cj_gongju->hqh_swords_blocking2); $data_remote2 = ($apiType == '-1' ? '' : hqh_cj_gongju_APIGetData('GetFilterWords2', $apiLinks, $apiToken, 'Config', 'hqh_swords_blocking2', null, $apiTime, $apiRefresh, $apiType)); $data_API2 = $data_remote2 . '|' . $data_Local2; } $matches1 = []; $matches2 = []; // 预编译处理函数 $processWords = function ($data, $content, $type, $apiRefresh) { if (!$data) return []; // ===== 缓存已解析的 pattern 列表 ===== static $patternCache = []; $cacheKey = md5($data.$apiRefresh); // 生成唯一键 if (!isset($patternCache[$cacheKey])) { $data = strip_tags($data); //清理html标签 $lines = explode("\n", $data); $clean_patterns = []; // 直接存储清理后的 pattern // 模糊检测可疑词 if($type){ $content = strip_tags($content); // 清理html标签 $content = preg_replace('/[^\p{Han}a-zA-Z0-9\s\r\n,。;()【】{}]/u', '', $content); // 保留:中文、英文、数字、空格、换行符\n,以及指定的部分标点符号,其余的进行清除 $content = preg_replace('/[ \t]+/', '', $content); // 清理空格 // $content = preg_replace('/(^[ \t]+)|([ \t]+$)/m', '', $content); // 去除每行首尾空格 // $content = trim($content); // 去除整个文本首尾空格 } foreach ($lines as $line) { $trimmed = trim($line); // 跳过空行和整行注释 if ($trimmed === '' || strpos($trimmed, '////') === 0) { continue; } // 移除行内注释 if (($commentPos = strpos($trimmed, '////')) !== false) { $trimmed = trim(substr($trimmed, 0, $commentPos)); } if ($trimmed === '') { continue; } // 清理符号:“空白、/、\、多个 || → |”,避免后续 array_map $cleaned = preg_replace(["/\s+/", "/[\/\\\\]/", "/\|\|+/"], ["", "|", "|"], $trimmed); $cleaned = trim($cleaned, '|'); if ($cleaned !== '') { $clean_patterns[] = $cleaned; } } // 去重缓存 $patternCache[$cacheKey] = array_unique($clean_patterns); } $clean_patterns = $patternCache[$cacheKey]; if (empty($clean_patterns)) { return []; } // ===== 分批匹配 ===== $chunk_size = 500; //分批词大小设置 if ($chunk_size > 0) { $matches = []; foreach (array_chunk($clean_patterns, $chunk_size) as $chunk) { $sub_pattern = implode('|', $chunk); $regex = '/' . $sub_pattern . '/si'; if (@preg_match_all($regex, $content, $m)) { $matches = array_merge($matches, $m[0]); } } return array_unique($matches); } else { // 不分批 $full_pattern = implode('|', $clean_patterns); $regex = '/' . $full_pattern . '/si'; if (@preg_match_all($regex, $content, $matches)) { return array_unique($matches[0]); } return []; } }; // 处理每个词表 if ($data_API1) { $matches1 = $processWords($data_API1, $content, $type, $apiRefresh); //处理词表 } if ($data_API2) { $matches2 = $processWords($data_API2, $content, $type, $apiRefresh); //处理词表 } // 返回词表数组 return [ 'words1' => $matches1, 'words2' => $matches2, 'words_k' => $matches2 ]; } 修改以上函数,增加以下功能: 1、对 $processWords 返回的关键词做一个过滤,把含有 $filtration 中任一字符内容的关键词都过滤掉不要 2、$filtration 是一个过滤参数,可能是单行也可能是多行,每个过滤内容用“|”符号分割的,所以要检查 $filtration 中的每行开头和结尾是否有“|”分割符,如果没有就先加上,然后把多行合为一行,再把多个“|”合为一个,然后按“|”做分割,分割后的就是过滤词,当$processWords 返回的关键词只要含有过滤词的就把这个关键词跳过不做处理输出,其他功能不能变,给回我完整代码
最新发布
09-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值