簡體   English   中英

向 PHP 中布爾查詢的每個項目添加一個術語(reg exp?)

[英]Adding a term to each item of a boolean query in PHP (reg exp?)

在瀏覽器端,用戶將輸入一個布爾查詢,它可能會變得復雜,我想將其轉換為 SQL SELECT語句。

用戶將輸入一個文本字符串,沿着a AND ((b OR c) OR (not d)) 正如我所說,這是一個任意文本字符串,包含一個布爾表達式。

它是針對軟件招聘人員的,因此 a、b、c、d 等將是技能,如 C、C++、UML、Python 等,因此前面的示例可能實際上讀取C++ AND ((UML OR Python) OR (not Perl))

我想擴展到(在這種情況下) SELECT * FROM candidates WHERE skill=C++ AND ((skill=UML OR skill=Python) OR (not skill=Perl))

我可以在SELECT語句之前添加,但是如何將(例如) C++ AND ((UML OR Python) OR (not Perl))skill=C++ AND ((skill=UML OR skill=Python) OR (not skill=Perl))並在 PHP 中對任何帶有任意數量括號的任意布爾表達式執行此操作?

我從您發布的示例中進行了以下觀察:您要做的就是將C++類的標記替換為skill=C++形式的標記,查詢的其余部分保持不變。 如果這並不總是正確的,您可能需要一個更復雜的解決方案,但如果這對您來說已經足夠了,以下應該有效:

$expr = 'C++ AND ((UML OR Python) OR (not Perl))';

// remove tokens that will not be replaced, here `(`, `)`, and `not`
$trimmed = str_replace(['(', ')', 'not'], ['', '', ''], $expr);

// split string based on the keywords `AND` and `OR` (case insensitive)
// keywords will also not be replaced
$tokens = preg_split('/AND|OR/i', $trimmed);

// create replacement tokens without leading/trailing whitespace
$replacementTokens = [];
foreach ($tokens as &$token) {
    $token = trim($token);
    $replacementTokens[] = "skill=$token";
}

// replace tokens and construct the query
$where = str_replace($tokens, $replacementTokens, $expr);
$query = "SELECT * FROM candidates WHERE $where";

如前所述,如果您需要更復雜的行為,此解決方案可能不起作用。 您可能還需要擴展關鍵字列表。 但是對於您提供的簡單用例,它避免了實際解析查詢的需要。

最后要注意的是,請確保清理用戶輸入,以免受到 SQL 注入的影響。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM