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
相关产品推荐
相关产品推荐

