[抛砖引玉]让内容替换支持正则

xiaoshuo88   ·   发表于 2022-4-14   ·   技术交流

让内容替换支持正则的小修改,修改前记得备份

效果如图:


extend/net/Gather.php

...
   //规则采集
    static public function field_rule($field_params, $html, $is_loop = false) {
        $field_params['rule'] = self::convert_sign_match($field_params['rule']);
        $field_params['merge'] = self::set_merge_default($field_params['rule'],$field_params['merge']);
        if(!empty($field_params['chapter'])){
            $field_params['rule']=str_replace('[章节标题]','(?P<title>[\s\S]*?)',$field_params['rule']);
        }
        if (!empty($field_params['rule']) && preg_match_all('/' . self::$sign_match . '/i', $field_params['merge'], $match_signs)) {
            if ($is_loop) {
                preg_match_all('/' . $field_params['rule'] . '/i', $html, $match_conts, PREG_SET_ORDER);
            } else {
                if (preg_match('/' . $field_params['rule'] . '/i', $html, $match_cont)) {
                    $match_conts = [$match_cont];
                }
            }
            $curI = 0;
            if(!empty($match_conts)){
                foreach ($match_conts as $match_cont) {
                    $curI++;
                    $re_match = [];
                    foreach ($match_signs['num'] as $ms_k => $ms_v) {
                        $re_match[$ms_k] = $match_cont['match' . $ms_v];
                    }
                    $contVal = str_replace($match_signs[0], $re_match, $field_params['merge']);
                    if(!empty($field_params['strip'])){
                        if(strpos($field_params['strip'],'all') !== false){
                            $contVal = self::strip_tags_content($contVal,'style,script,object');
                            $contVal = strip_tags($contVal);
                        } else {
                            $contVal = self::strip_tags_content($contVal,$field_params['strip']);
                        }
                    }
                    if(!empty($field_params['replace'])){
                        if(!is_array($field_params['replace'])){
                            $field_params['replace']=json_decode($field_params['replace'],true);
                        }
                        foreach ($field_params['replace'] as $key => $value) {
                            // 根据 isregex判断是否正则
                            if (!empty($value['isregex'])){
                                try {
                                    $contVal = preg_replace('/'.$value['find'].'/i', $value['replaces'], $contVal);
                                }catch (Exception $e){
                                    Log::info("正则替换失败,使用普通替换 ". $e->getMessage());
                                    $contVal = str_replace($value['find'], $value['replaces'], $contVal);
                                }
                            }else{
                                $contVal = str_replace($value['find'], $value['replaces'], $contVal);
                            }
                        }
                    }
                    if ($is_loop) {
                        if(!empty($field_params['chapter'])){
                            $val[] = ['title'=>$match_cont['title'],'url'=>$contVal];
                        }else{
                            $val[] = trim($contVal);
                        }
                    } else {
                        $val= trim($contVal);
                    }
                }
                return $val;
            }
        }
    }
...



public/admin/js/collect.js

...
form.on('submit(replace)', function(data){
    var index=$('[name="index"]').val();
    var reindex=$('[name="reindex"]').val();
    var replace_data={"find":$('[name="replace[find]"]').val(),
        "replaces":$('[name="replace[replaces]"]').val(),
        "isregex":data.field["replace[isregex]"]==null?'':'1'};
    if(parent.$('[name="rule['+index+'][replace]"]').val()){
        var field_replace=JSON.parse(parent.$('[name="rule['+index+'][replace]"]').val());
    }else{
        var field_replace=[];
    }
    if(reindex){
        field_replace[reindex]=replace_data;
    }else{
        field_replace.push(replace_data);
    }
    laytpl(parent.$('#replace').html()).render({"field_index":index,"list":field_replace}, function(html){
        parent.$('#replace_'+index+'_view').html(html);
    });
    parent.$('[name="rule['+index+'][replace]"]').val(JSON.stringify(field_replace));
    var layer_index = parent.layer.getFrameIndex(window.name);
    parent.layer.close(layer_index);
});
...


application/admin/view/collect/field_replace.html

...
<form class="layui-form" lay-filter="replace_form" action="{:url()}">
  <div class="layui-form-item">
    <label class="layui-form-label">目标</label>
    <div class="layui-input-block">
      <textarea name="replace[find]" placeholder="替换目标" class="layui-textarea"></textarea>
    </div>
  </div>
  <div class="layui-form-item">
    <label class="layui-form-label">替换</label>
    <div class="layui-input-block">
      <textarea name="replace[replaces]" placeholder="替换内容" class="layui-textarea"></textarea>
    </div>
  </div>
  // 添加一个checkbox
  <div class="layui-form-item">
    <label class="layui-form-label">正则</label>
    <div class="layui-input-block">
      <input type="checkbox" name="replace[isregex]" lay-skin="primary"/>
    </div>
  </div>
  <div class="layui-form-item">
    <div class="layui-input-block">
      <input name="index" type="hidden" value="{$index|default=""}" />
      <input name="reindex" type="hidden" value="{$reindex|default=""}" />
      <button class="layui-btn" lay-submit lay-filter="replace" type="submit">提交</button>
    </div>
  </div>
</form>
...


application/admin/view/collect/edit.html

查找 “内容替换”、“编辑替换”,把同一行内的 lay-size="600,347" 改为 lay-size="600,400" 
同样位置附近的
<colgroup>
    <col>
    <col>
    <col width="250">
</colgroup>
改为
<colgroup>
    <col>
    <col>
    <col width="80">
    <col width="250">
</colgroup>

同样位置附近的
<tr>
    <th>目标</th>
    <th>替换</th>
    <th><div align="center">操作</div></th>
</tr>
改为
<tr>
    <th>目标</th>
    <th>替换</th>
    <th>正则</th>
    <th><div align="center">操作</div></th>
</tr>

这里也可以不做修改,不影响功能


3 条回复   |  直到 2022-11-20 | 343 次浏览

ieehee
发表于 2022-4-14

666666666,感谢大佬分享

评论列表

  • 加载数据中...

编写评论内容

yuji
发表于 2022-11-18

试了好像没有用哎

评论列表

  • 加载数据中...

编写评论内容

xixi
发表于 2022-11-20

yuji

2022-11-18

试了好像没有用哎

我试了也没有用

评论列表

  • 加载数据中...

编写评论内容
登录后才可发表内容