2016-03-06 73 views
4

這是一個雙摺疊問題。我有一個ajax請求輪詢重複的帖子標題,但它被不同的引用/撇號和它們的變體拋出,當我知道有重複時返回負數。wordpress query with quote /撇號varrients

我有一個帖子標題是:「奔的大魚」,即用撇號(’)

但這樣做的永遠是下一個查詢回來負:

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 } 

所以我的問題是 一)如何獲得查詢返回的明顯重複的預期 b)和可能相關的,有沒有辦法,我們可以通過字符串,查找所有有效地搜索變的美聯社撇號和引號字符沒有多個查詢?

+0

我不是任何正則表達式專家,但是不應該在搜索特殊字符時加上\。例如:'.replace(/&/ g,'&')' - >'.replace(/ \&/ g,'&')'etc? –

+0

@dingo_d謝謝你指出,雖然我不認爲在這種情況下轉義是必要的。至少Webkit似乎能夠很好地處理這個問題,雖然較老的js引擎可能會有所例外。此示例源自https://css-tricks.com/snippets/javascript/htmlentities-for-javascript/。無論如何,它不會以任何方式影響sql查詢的結果。 – orionrush

回答

0

問題的癥結實際上回落到JS的原始編碼。其中一個絆倒我們的關鍵字符:&apos;,實際上沒有被html_entity_decode解碼,即使設置了ENT_QUOTES標誌。相反,它預計&#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轉義類時,Wordpress負責轉義我們。$wpdb->prepare