【问题标题】:wordpress query with quote/apostrophe varrients带有引号/撇号变体的wordpress查询
【发布时间】:2016-03-06 15:13:59
【问题描述】:

这是一个双重问题。我有一个 ajax 请求轮询重复的帖子标题,但它被不同的引号/撇号及其变体抛出,当我知道有重复时返回负数。

我有一篇标题为“Ben's Big Fish”的帖子,即带有撇号(’)

但是查询以下内容总是否定的:

Ben's Big Fish (')
Ben’s Big Fish (’)
Bens Big Fish (no apos)

但是,Big Fish 的查询会返回包含这些单词的所有变体帖子标题,包括包含引号和撇号的帖子标题。

以下是引起问题的主要角色:

Apostrophe          '   '
Open single quote   ‘   ‘ 
Close single quote  ’   ’
--- 
Quotation mark      "   "
Open double quotes  “   “ 
Close double quotes ”   ”

由于用户经常从 MS Word 文档等中提取文本,因此这些字符出现了很多。

在 js 端,我通过此函数对帖子标题进行编码,然后通过 json 将其发送到我的 ajax 处理程序:

function htmlEntities(str) {
    return String(str).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&apos;').replace(/‘/g, '&lsquo;').replace(/’/g, '&rsquo;').replace(/“/g, '&ldquo;').replace(/”/g, '&rdquo;');
} 

在我的 php ajax 挂钩中,我将传入的 POST 查询处理如下:

global $wpdb;
// Grab details from inbound POST array & prepare for sql
$title = html_entity_decode($_POST['post_title']); //first un-encode
$post_id = $_POST['post_id'];

$sim_query = "SELECT ID FROM $wpdb->posts WHERE post_status = 'publish' AND post_title LIKE '%%%s%%' AND ID != '%d'";
$sim_results = $wpdb->get_results( $wpdb->prepare( $sim_query, $wpdb->esc_like($title), $post_id ) );
if ($sim_results)
{ // Send the results back as json }

所以我的问题是 a)如何让查询按预期返回明显的重复项 b) 并且可能与此相关,有没有一种方法可以有效地搜索字符串来查找所有变体、撇号和引号字符的外观而无需多次查询?

【问题讨论】:

  • 无论如何我都不是正则表达式专家,但您在搜索特殊字符时不应该放 \ 吗?例如:.replace(/&amp;/g, '&amp;amp;') -> .replace(/\&amp;/g, '&amp;amp;') 等?
  • @dingo_d 感谢您指出这一点,尽管我认为在这种情况下不需要转义。 Webkit 至少似乎可以很好地处理这两种方式,尽管旧的 js 引擎可能会例外。此示例源自css-tricks.com/snippets/javascript/htmlentities-for-javascript。无论如何,它并没有影响到 sql 查询的结果。

标签: php mysql sql wordpress html-entities


【解决方案1】:

问题的症结其实又回到了 JS 的原始编码。让我们绊倒的关键字符之一:&amp;apos;,实际上并没有被html_entity_decode 解码,即使设置了ENT_QUOTES 标志也是如此。相反,它需要&amp;#039;

所以最后我们的js看起来像:

function htmlEntities(str) {
    return String(str).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&#039;').replace(/‘/g, '&lsquo;').replace(/’/g, '&rsquo;').replace(/“/g, '&ldquo;').replace(/”/g, '&rdquo;');
} 

我们用 PHP 解码:

 $title = html_entity_decode($_POST['post_title'], ENT_QUOTES,  'UTF-8' ); //first un-encode

还需要注意的是,SQL 会拒绝使用单引号和撇号。它要求它们是escaped by doubling them like so:''。当我们使用它的 SQL 转义类 $wpdb-&gt;prepare

时,Wordpress 会为我们处理转义

【讨论】:

    猜你喜欢
    • 2015-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    • 2010-11-23
    • 1970-01-01
    • 2020-05-06
    相关资源
    最近更新 更多