PHP中的preg_match字符串并管理每个匹配的结果

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (144)

我需要管理每个匹配结果,具体取决于每个结果(单词)。

字符串是SQL语句,我需要检查字符串(SQL语句)中的所有单词(表名),以site_前缀(以单词开头site_)开头。

根据单词(表名,如site_customerssite_products等),我将改变另一个不同的单词。

例:

我的字符串(SQL句子):

SELECT * FROM site_customers LEFT JOIN site_products ....

首先 - 提取site_*单词(在这种情况下为site_customer和site_products)。话是不是总是由空格分隔,也\n\t字符。

Second.-这些匹配的结果,改变他们在适当的方式:我需要更换site_customerssite_customers_02,并site_productsnew_site_products,因为有很多的表和很多条件来评价我不能使用其它替代系统。

在这种情况下,结果应该是:

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

求助谢谢!

提问于
用户回答回答于

您可以将表名与/site_(.*),?/m。匹配。

然后你可以用新的字符串替换它:

<?php

$string = ' SELECT * FROM site_customers LEFT JOIN site_products';

$pattern = '/site_(.*),?/m';

$replacement = '$0_02';

echo preg_replace($pattern, $replacement, $string);

这将威胁site_customerssite_products相同。两者都会附加_02

您还可以单独威胁第一个和第二个表,但您需要知道整个查询:

<?php

$string = ' SELECT * FROM site_customers LEFT JOIN site_products';

$pattern = '/SELECT \* FROM (site_(.*))? LEFT JOIN (site_(.*))?/m';

$replacement = 'SELECT * FROM $1_02 LEFT JOIN new_$3';

echo preg_replace($pattern, $replacement, $string);
用户回答回答于

对于您给出的示例,您可以使用preg_replace模式和替换的数组。注意我们使用\b(单词边界)来确保我们只匹配(例如)site_products而不是像aasite_productssite_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

如果它们与您提出的问题略有不同,您应该能够根据您的需求调整此代码。

扫码关注云+社区

领取腾讯云代金券