[英]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.