为了账号安全,请及时绑定邮箱和手机立即绑定

在数据库中搜索而不考虑 MySql 和 Laravel 中的 HTML 标签

在数据库中搜索而不考虑 MySql 和 Laravel 中的 HTML 标签

PHP
慕斯王 2023-04-02 10:32:42
我在数据库中有一条记录I am <b>"Asking"</b> a question在名为 log_message 的列中使用LogTable::where('log_message','like','%I am "Asking" a ques%')有什么办法可以实现吗?
查看完整描述

2 回答

?
杨魅力

TA贡献1811条经验 获得超6个赞

log_message最简单但在性能方面相当昂贵的方法是使用 MySQLsREGEXP_REPLACE函数预先删除列中的 HTML :

LogTable::whereRaw('regexp_replace(log_message, "<[^>]*>", "") like ?', '%I am "Asking" a ques%')

或者,如果您使用的是 MySQL 5.7+,则可以使用上面原始 where 查询中使用的相同 RegEx 将生成的列添加到表中:

alter table

    logs_table

add column

    log_message_clean text as

    (

        regexp_replace(log_message, '<[^>]*>', '')

    );

或者如果您想手动设置列的内容(例如在您的代码中更好地控制删除的内容,例如使用strip_tags 或 Purifier),只需添加一个新列并让您的模式在每次自动更新此列更改基列的log_message更改位置:


protected static function boot(): void

{

    self::creating(function (LogTable $model) {

        $model->log_message_clean = strip_tags($model->log_message);

    });

}


查看完整回答
反对 回复 2023-04-02
?
烙印99

TA贡献1829条经验 获得超13个赞

如果您使用的是 InnoDB 或 MyISAM 表,则可以执行全文搜索。


$search = "like','%I am \"Asking\" a ques%";

LogTable::whereRaw('match(log_message) against(?)', [$search])->get();

然后您需要添加全文索引。


DB:statement('alter table log_table add fulltext fulltext_index(log_message)');


查看完整回答
反对 回复 2023-04-02
  • 2 回答
  • 0 关注
  • 139 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信