这是一个有点复杂的问题。我有一个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, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"').replace(/'/g, ''').replace(/‘/g, '‘').replace(/’/g, '’').replace(/“/g, '“').replace(/”/g, '”');
}
在我的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(/&/g, '&')
->.replace(/\&/g, '&')
等等? - dingo_d