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

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

Строки - это предложения SQL, и мне нужно проверить все слова (имена таблиц) в строке (предложение SQL), начиная сПрефикс site_ (слова начинаются с site_).

В зависимости от слова (имя таблицы, например site_customers, site_products и т. Д.), Я изменю слово на другое.

Пример:

Моя строка (предложение SQL):

SELECT * FROM site_customers LEFT JOIN site_products ....

First.- Извлечение site_* слов (в данном случае site_customer и site_products).Слова не всегда разделяются пробелами, а также символами \n и \t.

Second.- для этих результатов сопоставления измените их соответствующим образом: мне нужно заменить site_customers на site_customers_02 и site_products с new_site_products, и я не могу использовать другую систему замены, потому что есть много таблиц и множество условий для оценки.

В этом случае результат должен быть:

SELECT * FROM site_customers_02 LEFT JOIN new_site_products ....<br/><br/>

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Вы можете сопоставить имена таблиц с /\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 голосов
/ 18 декабря 2018

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

...