Мне нужно управлять каждым соответствующим результатом, в зависимости от каждого результата (слова).
Строки являются предложениями SQL, и мне нужно проверить все слова (имена таблиц) в строке (предложение SQL), начиная с site_
префикс (слова начинающиеся с site_
).
В зависимости от слова (имя таблицы, как site_customers
, site_products
и т. д.), я буду менять слово на другое.
Пример:
Моя строка (предложение SQL):
SELECT * FROM site_customers LEFT JOIN site_products ....
Первый.- Извлечение site_*
слова (в данном случае site_customer и site_products).
Слова не всегда разделяются пробелами, а также \n
а также \t
символы.
Во-вторых, для этих результатов сопоставления измените их соответствующим образом: мне нужно заменить site_customers
с site_customers_02
, а также site_products
с new_site_products
, и я не могу использовать другую систему замены, потому что есть много таблиц и много условий для оценки.
В этом случае результат должен быть:
SELECT * FROM site_customers_02 LEFT JOIN new_site_products ....<br/><br/>
Для приведенного вами примера вы можете использовать preg_replace
с массивами шаблонов и замен. Обратите внимание, мы используем \b
(граница слова), чтобы гарантировать, что мы только совпадаем (например) site_products
а не как то aasite_products
или же site_productsxx
,
$string = 'SELECT * FROM site_customers LEFT JOIN site_products';
$patterns = array(
'/\b(site_customers)\b/',
'/\b(site_products)\b/'
);
$replacements = array(
'${1}_02',
'new_$1'
);
echo preg_replace($patterns, $replacements, $string);
Выход:
SELECT * FROM site_customers_02 LEFT JOIN new_site_products
Вы должны иметь возможность адаптировать этот код к вашим потребностям, если они немного отличаются от вопроса, который вы задали.
Вы можете сопоставить имена таблиц с /\bsite_[a-zA-Z]*/
, Если они содержат числа, вы должны также сопоставить их с /\bsite_[a-zA-Z0-9]*/
,
Затем вы можете заменить его новой строкой:
<?php
$string = 'SELECT * FROM site_customers LEFT JOIN site_products';
$pattern = '/\bsite_[a-zA-Z0-9]*/';
$replacement = '$0_02';
echo preg_replace($pattern, $replacement, $string);
Это будет угроза site_customers
а также site_products
так же. К обоим это добавится _02
,
Пример на 3v4l: https://3v4l.org/Ti7n4
Вы также можете угрожать первой и второй таблицам отдельно, но вам нужно знать весь запрос:
<?php
$string = 'SELECT * FROM site_customers LEFT JOIN site_products';
$pattern = '/SELECT \* FROM (\bsite_[a-zA-Z0-9]*) LEFT JOIN (\bsite_[a-zA-Z0-9]*)/';
$replacement = 'SELECT * FROM $1_02 LEFT JOIN new_$2';
echo preg_replace($pattern, $replacement, $string);
Пример на 3v4l: https://3v4l.org/0YorR
Вы также можете извлечь слова, как site_
а потом заменить их:
<?php
$re = '/\bsite_[a-zA-Z0-9]*/';
$query = 'SELECT * FROM site_customers LEFT JOIN site_products';
preg_match_all($re, $query, $matches, PREG_SET_ORDER, 0);
// Print the entire match result
var_dump($matches);
// Replace old tables with new ones
$old = [
$matches[0][0], // First table name
$matches[1][0], // Second table name
];
$new = [
$matches[0][0] . '_02', // Append _02
'new_' . $matches[1][0], // Prepand new_
];
$query = str_replace($old, $new, $query);
// Print the new query
echo $query;
Пример на 3v4l: https://3v4l.org/BMpPR