首页 > 解决方案 > wp PHP:使用带有双反斜杠的 REGEXP 的 MySQL8 查询。我可以避免使用 \\\\ 吗?

问题描述

由于我有超过 100,000 个帖子,我直接使用 MySQL 而不是 wp codex 来测试复杂的正则表达式以添加标签。为了以可视格式快速测试结果,我创建了一个直接使用相同 SQL 语句的 wordpress 搜索页面。这没有问题,除非有转义的正则表达式字符,例如\bMySQL8 语句中的\\b. 如果我在 PHP 中使用该确切语句,则无法识别双反斜杠。

例如(使用简单的正则表达式):

global $wpdb;
$sqlreal = "
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
";

$post_id = $wpdb->get_results($sqlreal);
$second_query = new WP_Query( array(
    'post__in' => $post_id,
) );

ETC..

这不起作用,因为\\b\b在 PHP 中出现。我知道如果我写了\\\\b它就会起作用,但是我经常从我的 MySQL Workbench 快速剪切和粘贴,所以想知道是否有另一种方法,例如 PHP 函数,它\\b只是作为原始文本出现,因为SQL 查询。

我尝试了各种方法,例如:

str_replace('\\\\', '\\\\\\\\', $sqlreal);


preg_quote($sqlreal);


mysqli_real_escape_string($mysqli, $sqlreal);

\\etc

Stackoverflow 中似乎有很多类似的问题,但我尝试过的方法都没有奏效。似乎必须有一个简单的解决方案?还是我不得不全部转换\\b\\\\b?在为数百个片段剪切和粘贴 SQL 代码时,这样做很痛苦......

标签: phpmysqlregexwordpressbackslash

解决方案


我刚刚发现如果从文本文件中加载文本,那么它的原始和反斜杠是完整的。因此,如果我将 SQL 查询粘贴到外部文件中并将其加载到 PHP 中,file_get_contents("data.txt")那么文本是未更改的原始文本,并且所有反斜杠都与原始文件完全相同。即使在 PHP 中存储为变量。其实这样更方便。尽管如此,我对任何其他方法都很感兴趣......


推荐阅读