PHP preg_replace вставить строку там, где ее нет - PullRequest
0 голосов
/ 11 января 2019

У меня есть переменная $ var, которая содержит строку.

Пример:

$var = "one, two , three = ?, four = 'val', five  , six = 1, seven, eight = 'val' , nine";

Я хочу отредактировать $ var с помощью preg_replace () таким образом, чтобы $ var выглядел следующим образом:

"one = ?, two = ?, three = ?, four = 'val', five = ?, six = 1, seven = ?, eight = 'val', nine = ?"

Я имею в виду: если столбцу не присвоено значение, установите для него значение ' = ?' и удалите ненужные пробелы.

Я попробовал следующее регулярное выражение, но оно даже не близко:

$sql['set'] = preg_replace("/(\w+)\s?,/", "$1 = ?,", $sql['set']);

Я искал решения, но не могу охватить все возможности.

Ответы [ 4 ]

0 голосов
/ 12 января 2019

Другим решением может быть использование explode и array_map и использование preg_match проверки, не соответствует ли значение шаблону ключ = значение. Затем, если это не так, добавьте = ? к значению.

шаблон

\w+\h*=\h*\S

Это будет соответствовать

  • \w+\h* соответствует 1+ символам слова, за которыми следуют 0+ горизонтальных пробелов
  • = Совпадение буквально
  • \h*\S Соответствует 0+ горизонтальным пробелам, за которыми следует поиск не пропускового символа

Например

$var = "one, two , three = ?, four = 'val', five  , six = 1, seven, eight = 'val' , nine";

echo implode(', ', array_map(function($x){
    return preg_match('/\w+\h*=\h*\S/', $x) === 0 ? $x.' = ?' : $x;
}, array_map("trim", explode(',', $var))));

Результат

one = ?, two = ?, three = ?, four = 'val', five = ?, six = 1, seven = ?, eight = 'val', nine = ?

Php demo

Без использования регулярного выражения и само имя столбца не может содержать знак равенства, вы можете использовать strpos , чтобы проверить, содержит ли строка =:

$var = "one, two , three = ?, four = 'val', five  , six = 1, seven, eight = 'val' , nine";

echo implode(', ', array_map(function($x){
    return strpos($x, '=') === false ? $x.' = ?' : $x;
}, array_map("trim", explode(',', $var))));

Php демо

0 голосов
/ 11 января 2019

вот решение без регулярных выражений:

$var = "one, two , three = ?, four = 'val', five  , six = 1, seven, eight = 'val' , nine";
$arr = explode(',', $var);
foreach($arr as $i => $e)
{
    $arr[$i] = (strpos($e, '=') === false) ? trim($e).' = ?' : trim($e);
}

echo implode(', ', $arr);
0 голосов
/ 11 января 2019

Это регулярное выражение позаботится о том, чтобы вы пропустили = ? в исходной строке,

([a-zA-Z]+)\s*(?:(,)|$)

При замене на \1 = ?\2, но для обрезки лишних пробелов перед запятой вам понадобится другое регулярное выражение +, для замены на ,, поэтому вы можете использовать эту множественную замену в php с этим кодом,

$var = "one, two , three = ?, four = 'val', five  , six = 1, seven, eight = 'val' , nine";
echo preg_replace(['/([a-zA-Z]+)\s*(?:(,)|$)/i', '/ +,/i'], ['\1 = ?\2', ','], $var);

Что дает желаемый результат,

one = ?, two = ?, three = ?, four = 'val', five = ?, six = 1, seven = ?, eight = 'val', nine = ?
0 голосов
/ 11 января 2019

Это почти там действительно.

  • Вам просто нужно * в качестве квантификатора для пространства вместо ?.

  • В идеале не следует использовать \w для сопоставления клавиш, поскольку это также может случайно совпадать с = 1.

  • Возможно, используйте lookarounds , чтобы убедиться, что = раньше не было.

Я бы пошел на что-то вроде:

preg_replace("/ (?<= ^|,|,\s)  ([a-z]+)  (?=\s*(,|$)) /x", "$1 = ?", $var)
#                       ↑         ↑            ↑
#              preceding comma   key   following comma / end

Предыдущее совпадение с запятой немного хакерское (просто ищет один необязательный пробел), но также избыточно, если вы ограничиваете допустимые имена ключей.

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