Php 自动将字符串附加到匹配的短语

Php 自动将字符串附加到匹配的短语,php,preg-match-all,Php,Preg Match All,这里有点问题,已经搜索过但找不到类似的东西 使用函数如preg\u match\u all没有任何问题,但我希望能够在不完全替换字符串的情况下为其所有匹配预先添加字符串 我想自动向查询中的所有表名添加表前缀 你有这个密码吗 if(preg_match_all('/((FROM|JOIN) `(.*)`)/', $str, $matches)) { $tables = $matches[3]; } 这似乎至少适用于选择和连接查询,但还不知道其他查询。 但我希望能够自动将特定前缀添加到匹配

这里有点问题,已经搜索过但找不到类似的东西

使用函数如preg\u match\u all没有任何问题,但我希望能够在不完全替换字符串的情况下为其所有匹配预先添加字符串

我想自动向查询中的所有表名添加表前缀

你有这个密码吗

if(preg_match_all('/((FROM|JOIN) `(.*)`)/', $str, $matches)) {
    $tables = $matches[3];
}
这似乎至少适用于选择和连接查询,但还不知道其他查询。 但我希望能够自动将特定前缀添加到匹配的表名中;不仅仅是列出它们

任何想法;这是否可行呢

只是尽量避免在查询过程中必须在表名前面加上表前缀

输入示例:

SELECT mail_id, mail_date, mail_from, mail_to, mail_subject, (
            (
            SELECT COUNT(*)
            FROM messagecenter_qmails
            WHERE qmail_mail_id = mail_id
            ) + (
            SELECT COUNT(*)
            FROM `messagecenter_rels`
            WHERE rel_mail_id = mail_id
            )
            ) AS email_total, (
            SELECT COUNT(*)
            FROM `messagecenter_rels`
            WHERE rel_mail_id = mail_id
            ) AS email_sent, (
            SELECT COUNT(*)
            FROM `messagecenter_rels`
            INNER JOIN email_receives ON receive_reply_to = rel_sent_id
            WHERE rel_mail_id = mail_id
            ) AS email_reply FROM messagecenter_emails WHERE mail_draft='No' ORDER BY mail_id ASC LIMIT 0,10
预期输出:

SELECT mail_id, mail_date, mail_from, mail_to, mail_subject, (
            (
            SELECT COUNT(*)
            FROM sys_messagecenter_qmails
            WHERE qmail_mail_id = mail_id
            ) + (
            SELECT COUNT(*)
            FROM `sys_messagecenter_rels`
            WHERE rel_mail_id = mail_id
            )
            ) AS email_total, (
            SELECT COUNT(*)
            FROM `sys_messagecenter_rels`
            WHERE rel_mail_id = mail_id
            ) AS email_sent, (
            SELECT COUNT(*)
            FROM `sys_messagecenter_rels`
            INNER JOIN sys_email_receives ON receive_reply_to = rel_sent_id
            WHERE rel_mail_id = mail_id
            ) AS email_reply FROM sys_messagecenter_emails WHERE mail_draft='No' ORDER BY mail_id ASC LIMIT 0,10

您可以看到两种代码/查询之间的唯一区别是,输入表名称没有前缀,例如电子邮件接收,而结果有表前缀,例如sys\u电子邮件接收preg\u replace是正确的函数。使用反向参考,可在更换过程中重复使用已识别的零件

$newSql = preg_replace('~(FROM|JOIN) +`([^`]+)`~','$1 `sys_$2`',$sql);
$1:在第一个括号中识别的字符串,此处为FROM或JOIN

$2:表名

前缀i set fix.

一个选项可用于3个捕获组

\b(?:FROM|JOIN)\h+\K(`)?([^\s`]+)((?(1)`))(?!\S)
解释

  • \b(?:FROM | JOIN)\h+\K
    匹配FROM或JOIN,后跟1+水平空白字符。然后使用
    \K
  • (`)?
    可选捕获组1,匹配反勾号
  • ([^\s`]+)
    捕获组2,匹配1+个字符,而不是backtick或whtiespace字符
  • ((?(1)
    )`捕获组3,如果组1存在,则if子句与反勾号匹配
  • (?!\S)
    负前瞻,在右侧断言空白边界
|

在替换中,使用带有
sys的3个捕获组

$1sys_$2$3
比如说

$result = preg_replace('/\b(?:FROM|JOIN)\h+\K(`)?([^\s`]+)((?(1)`))(?!\S)/', '$1sys_$2$3', $str);

你能展示一个输入和预期输出的例子吗?根据要求增加了输入和预期输出的例子。希望下次我不需要像您需要
preg\u replace
那样被提醒。这里有一个。不确定preg_replace是否会进行字符串替换,因此,如果初始匹配是Cats,并且我想预先设置我的u,它将成为我的u,而不是我的u Cats。我希望实现的是Match和prePend,这样它就可以匹配表名Cats,并在表名前面加上前缀,这样我们就有了我的CatsIs,有什么好的理由这样做,而不是正确地解析字符串?如果表列(或查询中的任何其他内容)包含来自
或连接的子字符串怎么办?据我所知,来自@thefirst bird的解决方案可以做到这一点。