Как сопоставить данные из базы данных с помощью регулярного выражения? - PullRequest
0 голосов
/ 16 ноября 2018

Я сохранил регулярное выражение в столбце базы данных MySQL (или SQLite3), например:

Database column screenshot

qus | ans
----- |  -----
(hii?|hell?o) | Hello There...

Теперь, если входные данные соответствуют hi или hii, helo или hello, тогда ответьте Hello Hello

if(input == "hi" /*or hii*/){
  return ans; //ans = Hello There
}

Это возможно? если да, как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 17 ноября 2018

Регулярное выражение может исходить из столбца таблицы, а не быть литералом:

CREATE TABLE regexps (
    re VARCHAR(99)
);
INSERT INTO regexps (re)
    VALUES ('hii?|hell?o'), ('aloha'), ('bonjour');

SELECT CONCAT('matches ', re)
    FROM regexps
    WHERE "hi, y'all" REGEXP re;
SELECT CONCAT('matches ', re)
    FROM regexps
    WHERE "bonjour and aloha" REGEXP re;
SELECT CONCAT('matches ', re)
    FROM regexps
    WHERE "oops: high" REGEXP re;

...

mysql> SELECT * FROM regexps;
+-------------+
| re          |
+-------------+
| hii?|hell?o |
| aloha       |
| bonjour     |
+-------------+
3 rows in set (0.00 sec)

mysql>     SELECT CONCAT('matches ', re)
    ->         FROM regexps
    ->         WHERE "hi, y'all" REGEXP re;
+------------------------+
| CONCAT('matches ', re) |
+------------------------+
| matches hii?|hell?o    |
+------------------------+
1 row in set (0.01 sec)

mysql>     SELECT CONCAT('matches ', re)
    ->         FROM regexps
    ->         WHERE "bonjour and aloha" REGEXP re;
+------------------------+
| CONCAT('matches ', re) |
+------------------------+
| matches aloha          |
| matches bonjour        |
+------------------------+
2 rows in set (0.00 sec)

mysql>     SELECT CONCAT('matches ', re)
    ->         FROM regexps
    ->         WHERE "oops: high" REGEXP re;
+------------------------+
| CONCAT('matches ', re) |
+------------------------+
| matches hii?|hell?o    |
+------------------------+
1 row in set (0.00 sec)

Я хочу сопоставить только привет или привет, или привет, или привет, затем ответьте "Hello There"

re равно hii?|hell?o, answer равно Hello There. Запрос

SELECT answer FROM regexps WHERE $input REGEXP re LIMIT 1

Я добавляю LIMIT, потому что может возникнуть ситуация, когда два разных регулярных выражения совпадают.

0 голосов
/ 16 ноября 2018

Вы можете использовать preg match и preg replace для проверки вашего регулярного выражения

Пример:

$input = 'hii user';
$output = 'Hi there';
// If your regex matches
if(preg_match('/(hii?|hell?o)/', $input))
{
    // succes;
    // Replace the input by your answer
    echo preg_replace('/(hii?|hell?o)/', $output, $input); // returns Hi there user
}
else
{
    echo 'fail';
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...