regex — PHP preg_match слова внутри строки и управлять каждым соответствующим результатом

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

Строки являются предложениями 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/>

0

Решение

Для приведенного вами примера вы можете использовать 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

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

Демо на 3v4l.org

0

Другие решения

Вы можете сопоставить имена таблиц с /\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

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector