You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TYPO3 11:如何在QueryBuilder中使用REGEXP_REPLACE实现富文本搜索

在TYPO3 QueryBuilder中实现富文本字段的HTML标签过滤搜索

你的问题出在误用了expr()->literal()——它把整个REGEXP_REPLACE表达式当成字符串字面量处理,导致QueryBuilder给它套上了引号和反引号,数据库会误以为这是一个列名,从而抛出「未知列」错误。

以下是两种可行的解决方案:

方案一:使用ExpressionBuilder构建合法的LIKE条件

通过sprintf拼接带正确字段引用的正则替换表达式,直接传入like方法的第一个参数:

// 处理搜索关键词,转义通配符
$searchPattern = '%' . $queryBuilder->escapeLikeWildcards($searchWord) . '%';
// 创建命名参数,避免SQL注入
$searchParameter = $queryBuilder->createNamedParameter($searchPattern);

// 构建去除HTML标签的表达式,确保字段被正确引用
$cleanContentExpr = sprintf(
    'REGEXP_REPLACE(%s, \'<[^>]*>\', \'\')',
    $queryBuilder->quoteIdentifier('a.content')
);

// 添加OR条件
$queryBuilder->orWhere(
    $queryBuilder->expr()->like(
        $cleanContentExpr,
        $searchParameter
    )
);

方案二:直接添加原生SQL片段

如果觉得拼接表达式麻烦,也可以直接在orWhere中写入原生SQL逻辑,注意保持参数绑定以避免注入:

$searchPattern = '%' . $queryBuilder->escapeLikeWildcards($searchWord) . '%';
$searchParameter = $queryBuilder->createNamedParameter($searchPattern);

$queryBuilder->orWhere(
    'REGEXP_REPLACE(a.content, \'<[^>]*>\', \'\') LIKE ' . $searchParameter
);

注意事项

  • 确保你的数据库支持REGEXP_REPLACE函数:MySQL 8.0+、MariaDB 10.0.5+都支持该函数,若使用旧版本数据库,可能需要用REPLACE结合多次调用或其他方式实现HTML标签过滤。
  • 始终使用createNamedParameter和escapeLikeWildcards处理用户输入,防止SQL注入风险。

内容的提问来源于stack exchange,提问作者Wintermilch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 13:55:38