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

PHP调用MySQL8 REGEXP需写\\?有无无需转义双反斜杠的方法

最优解决方案:使用PHP Nowdoc语法

PHP的Nowdoc是单引号风格的长字符串定义结构,不会解析任何转义序列、变量,你从MySQL Workbench复制的完整SQL语句可以直接粘贴进去,不需要做任何修改,完美适配你的需求。
示例代码如下:

global $wpdb;
// Nowdoc 语法:标识符用单引号包裹,内部内容完全原样保留
$sqlreal = <<<'SQL'
SELECT wp_posts.* 
FROM wp_posts 
WHERE (wp_posts.post_title REGEXP '\\b(com(edy|ical)|doc(o|umentary))\\b' 
OR  wp_posts.post_content REGEXP '\\b(com(edy|ical)|doc(o|umentary))\\b' )
AND ( wp_posts.ID NOT IN ( SELECT object_id FROM wp_term_relationships WHERE term_taxonomy_id IN (215) ) ) 
AND (wp_posts.post_type = 'post' OR wp_posts.post_type = 'xdays1') 
GROUP BY wp_posts.ID 
ORDER BY wp_posts.post_date DESC
SQL;

$post_results = $wpdb->get_results($sqlreal);
// 注意原代码此处有误,需要提取ID列表才能传入WP_Query
$post_ids = wp_list_pluck($post_results, 'ID');
$second_query = new WP_Query( array(
    'post__in' => $post_ids,
    'orderby' => 'post__in', // 可选,保留SQL查询的排序规则
) );

批量处理历史SQL的方案

如果你已经有数百段写在PHP双引号字符串中的SQL片段,不想逐个调整语法,可采用以下方案:

  1. 将所有SQL片段统一提取到独立的.sql文本文件中,使用file_get_contents()读取文件内容,读取到的内容会完全保留原始格式,不会被PHP解析转义,无需任何替换操作
  2. 如果仍要保留在PHP文件中,可使用IDE的全局替换功能,一次性将所有SQL中的\替换为\\,几秒即可完成数百段的处理

之前尝试的方案无效的原因

  • mysqli_real_escape_string仅用于转义SQL查询中动态传入的参数值,不能用于处理完整SQL语句,否则会破坏语句结构
  • preg_quote是为PHP自身的正则表达式做转义的工具,和MySQL语句转义场景完全不匹配
  • 之前写的str_replace逻辑无效,是因为替换操作执行在PHP解析字符串之后,此时\\已经被转义为\,替换已经失效

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 17:12:03