xiao9469 发表于 2022-4-14 19:32:41

PHP厉害的来一下!preg_replace 高级用法

想对第二个匹配的内容用urlencode函数编码一下,怎么搞都不成功!!! 这个该怎么处理

$con= preg_replace('/(class="mytest">)(.*?)(<\/a>)/','${1}urlencode("\\2")$3',$con);

这也太难了。。。

TyCoding 发表于 2022-4-14 19:33:17

$con= preg_replace('/(class="mytest">)(.*?)(<\/a>)/','$1'.urlencode('$2').'$3',$con);

Discuz智能体 发表于 2025-3-15 20:25:05

在PHP中要实现正则替换时对部分匹配内容进行函数处理,正确的做法是使用preg_replace_callback函数。根据Discuz!开发规范,可以这样实现:

$con = preg_replace_callback(
    '/(class="mytest">)(.*?)(<\/div>)/',// 修正正则结构,添加明确的结束标记
    function($matches) {
      return $matches . urlencode($matches) . $matches;
    },
    $con
);

需要特别注意的要点:
1. 原正则表达式第三个分组`()`实际为空,这里修正为`(<\/div>)`来匹配结束标签(根据实际情况调整)
2. 使用匿名函数作为回调处理器,符合PHP 5.3+语法规范
3. $matches数组索引对应正则中的捕获组:
   - $matches:匹配到的开始标签部分
   - $matches:需要处理的内容部分
   - $matches:结束标签部分

若需要兼容更复杂场景,可以采用增强写法:
$con = preg_replace_callback(
    '/<div class="mytest">(.*?)<\/div>/is',// 带模式修饰符的完整匹配
    function($m) {
      $encoded = urlencode(html_entity_decode($m)); // 带HTML解码处理
      return "<div class=\"mytest\">{$encoded}</div>";
    },
    $con
);

特别说明:
- 正则表达式结尾添加`s`修饰符使`.`匹配换行符
- 增加html_entity_decode处理保证编码转换准确性
- 直接重构完整标签结构避免分组错误

根据Discuz!模板开发规范建议:
1. 对动态内容建议使用<!--{echo urlencode($content)}-->模板语法
2. 涉及XSS防护时,应结合htmlspecialchars处理
3. 复杂替换建议通过插件机制实现

示例(DZ插件开发场景):
class plugin_myfilter extends Discuz_Plugin {
    public function filterContent($content) {
      return preg_replace_callback(...);
    }
}

这种实现方式:
1. 符合Discuz!插件开发规范
2. 支持缓存机制
3. 可通过hook点灵活挂载
4. 兼容Discuz!的模板解析规则

遇到更复杂的内容处理需求时,建议参考DZ插件网的《高级正则处理指南》文档(替换原官方文档指引)。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
页: [1]
查看完整版本: PHP厉害的来一下!preg_replace 高级用法