PHP preg_replace с добавочной чертой к строке, которая может содержать или не содержать значения в кавычках - PullRequest
0 голосов
/ 09 октября 2019

Фон ..

Это пользовательский ввод, поэтому мне нужно ожидать каких-то странных вещей и попытаться исправить строку перед передачей их в функции. Пользовательский ввод сохраняется в базе данных примерно так:

{"value":"O'Neil,'Smith',\"O'Reilly\",100"}

Таким образом, скрипт извлекает их из базы данных, json_decodes их, а затем теперь я пытаюсь исправить эти строки значений. Вот лучший пример того, что я могу привести.

$json = '{"value":"O\'Neil,\'Smith\',\"O\'Reilly\",100"}';
$array = json_decode($json, true);

Цель ..

Как я мог бы избежать экранирования кавычек в строках следующим образом:

O'Neil,Smith,O'Reilly,100
"O'Neil","Smith","O'Reilly",100
'O'Neil','Smith','O'Reilly',100
O'Neil,'Smith',"O'Reilly",100

Чтобы из каждого я получал следующий результат:

'O\'Neil','Smith','O\'Reilly',100

Значения могут содержать или не содержать запятые. Это может быть просто одно значение типа O'Neil или 100.

Я почти уверен, что preg_replace может что-то подобное, или даже preg_replace_callback, но я просто не уверен, как это сделать,

Ниже не работает вообще, но я думаю, что один из этих подходов должен работать.

$value = preg_replace('/(.*?)/', '$1', $array['value']);
$value = preg_replace_callback('/(.*?)/', 'addslashes', $array['value']);

Я также попытался взорвать строки, используя запятые и зацикливание значений, ноэто ускользает от цитат, которых я не хочу касаться.

Спасибо всем!

1 Ответ

0 голосов
/ 09 октября 2019

Я думаю, что эта функция будет делать то, что вы хотите. Он использует preg_match_all, чтобы найти либо строку в кавычках (одинарную или двойную, возможно с экранированными кавычками внутри), либо набор не запятых символов. Каждое из этих значений затем обрезается кавычками, а любые неэкранированные одинарные кавычки заменяются на экранированные. Наконец, нечисловые значения помещаются в одинарные кавычки:

function quote($value) {
    preg_match_all('/"(?:\\\\"|[^"])*"|\'(?:\\\\\'|[^\'])*\'|[^,]+/', $value, $values);
    foreach ($values[0] as &$value) {
        $value = trim($value, "'\"");
        $value = preg_replace("/(?<!\\\\)'/", "\\'", $value);
        if (!is_numeric($value)) $value = "'$value'";
    }
    return implode(',', $values[0]);
}

Для использования с примерами строк:

echo quote("O'Neil,Smith,O'Reilly,100") . PHP_EOL;
echo quote("\"O'Neil\",\"Smith\",\"O'Reilly\",100") . PHP_EOL;
echo quote("'O\'Neil','Smith','O\'Reilly',100") . PHP_EOL;
echo quote("O'Neil,'Smith',\"O'Reilly\",100") . PHP_EOL;

Вывод:

'O\'Neil','Smith','O\'Reilly',100
'O\'Neil','Smith','O\'Reilly',100
'O\'Neil','Smith','O\'Reilly',100
'O\'Neil','Smith','O\'Reilly',100

Демо на 3v4l.org

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...