替换从匹配位置到第一个 ' 符号的所有匹配字符串

Replace all matched strings from matched position up to the first ' symbol

我有一个包含 $lang 关键字的查询字符串,现在我想使用循环将 $lang 之前的所有内容替换为另一个数组的内容,直到第一次出现 ' 符号。

下面是我的查询字符串:

select 
COUNT(t1.id) as total, 
COUNT(t1.id) as 'total_$lang', 
CASE t2.`precence`
        WHEN '0' THEN 'Absent'
        WHEN '1' THEN 'Present'
        ELSE 'Unknown'
    END AS series,
CONCAT(DAYNAME(t1.date),' ',DATE_FORMAT(t1.date,'%Y %M %d')) AS ticks,
CONCAT(DATE_FORMAT(t1.date, '%a'),' ',DATE_FORMAT(t1.date,'%Y %M %d')) AS abv,
    courses.no AS label,
CASE t2.`precence`
        WHEN '0' THEN 'absent_$lang'
        WHEN '1' THEN 'present_$lang'
        ELSE 'unknown_$lang'
    END AS 'attendance_state_$lang',
CONCAT(DAYNAME(t1.date),' ',DATE_FORMAT(t1.date,'%Y %M %d')) AS 'attendance_date_$lang',
CONCAT(DATE_FORMAT(t1.date, '%a'),' ',DATE_FORMAT(t1.date,'%Y %M %d')) AS 'attendance_date_abv_$lang',
courses.no AS 'course_num_$lang'

from course_attendances as t1 left join `student_attendances` as t2 on t2.`course_attendance_id` = t1.`id`
right join courses ON courses.id = t1.course_id
where t1.`course_id` = '1' AND t1.date BETWEEN '2015-01-01' AND '2015-11-02'
group by t1.`date`,t2.`precence`

现在我想用以下数组的内容替换

Array
(
    [total_en] => Total
    [absent_en] => Absent
    [present_en] => Present
    [unknown_en] => Unknown
    [attendance_state_en] => Attendance State
    [attendance_date_en] => Attendance Date
    [attendance_date_abv_en] => Attendance Date (abv)
    [course_num_en] => Course Number
)

我只需要问题的查找匹配案例部分,如有任何帮助,谢谢。

你可以这样做

 // Your query string 
 $main_query = "SELECT 
                  COUNT(t1.id) as total, 
                  COUNT(t1.id) as 'total_$lang', 
                  CASE t2.`precence`
                    WHEN '0' THEN 'Absent'
                    WHEN '1' THEN 'Present'
                    ELSE 'Unknown'
                 END AS series,
                 CONCAT(DAYNAME(t1.date),' ',DATE_FORMAT(t1.date,'%Y %M %d')) AS ticks,
                 CONCAT(DATE_FORMAT(t1.date, '%a'),' ',DATE_FORMAT(t1.date,'%Y %M %d')) AS abv,
                 courses.no AS label,
                 CASE t2.`precence`
                   WHEN '0' THEN 'absent_$lang'
                   WHEN '1' THEN 'present_$lang'
                   ELSE 'unknown_$lang'
                 END AS 'attendance_state_$lang',
                 CONCAT(DAYNAME(t1.date),' ',DATE_FORMAT(t1.date,'%Y %M %d')) AS 'attendance_date_$lang',
                 CONCAT(DATE_FORMAT(t1.date, '%a'),' ',DATE_FORMAT(t1.date,'%Y %M %d')) AS 'attendance_date_abv_$lang',
                 courses.no AS 'course_num_$lang'

            FROM course_attendances as t1 left join `student_attendances` as t2 on t2.`course_attendance_id` = t1.`id`
            RIGHT JOIN courses ON courses.id = t1.course_id
            WHERE t1.`course_id` = '1' AND t1.date BETWEEN '2015-01-01' AND '2015-11-02'
            GROUP BY t1.`date`,t2.`precence`";

还有你的数据样本数组

$reportConfig = Array
     (
       'total_en' => 'Total',
       'absent_en' => 'Absent',
       'present_en' => 'Present',
       'unknown_en' => 'Unknown',
       'attendance_state_en' => 'Attendance State',
       'attendance_date_en' => 'Attendance Date',
       'attendance_date_abv_en' => 'Attendance Date (abv)',
       'course_num_en' => 'Course Number'
   );


 if(preg_match('/_$lang/',$main_query)){
    foreach($reportConfig as $rep_conf_key=>$rep_conf_val){
       $rep_conf_key_temp = preg_replace('/_'.$lang.'/','_\$lang',$rep_conf_key);
       if(preg_match('/'.$rep_conf_key_temp.'/',$main_query)){
          $main_query = preg_replace('/'.$rep_conf_key_temp.'/',$rep_conf_val,$main_query);
       }
    }

 }
 echo '<pre/>'; print_r($main_query);

结果

SELECT 
COUNT(t1.id) as total, 
COUNT(t1.id) as 'Total', 
CASE t2.`precence`
        WHEN '0' THEN 'Absent'
        WHEN '1' THEN 'Present'
        ELSE 'Unknown'
    END AS series,
CONCAT(DAYNAME(t1.date),' ',DATE_FORMAT(t1.date,'%Y %M %d')) AS ticks,
CONCAT(DATE_FORMAT(t1.date, '%a'),' ',DATE_FORMAT(t1.date,'%Y %M %d')) AS abv,
    courses.no AS label,
CASE t2.`precence`
        WHEN '0' THEN 'Absent'
        WHEN '1' THEN 'Present'
        ELSE 'Unknown'
    END AS 'Attendance State',
CONCAT(DAYNAME(t1.date),' ',DATE_FORMAT(t1.date,'%Y %M %d')) AS 'Attendance Date',
CONCAT(DATE_FORMAT(t1.date, '%a'),' ',DATE_FORMAT(t1.date,'%Y %M %d')) AS 'Attendance Date (abv)',
courses.no AS 'Course Number'

 FROM course_attendances as t1 left join `student_attendances` as t2 on t2.`course_attendance_id` = t1.`id`
 RIGHT JOIN courses ON courses.id = t1.course_id
 WHERE t1.`course_id` = '1' AND t1.date BETWEEN '2015-01-01' AND '2016-11-17'
 GROUP BY t1.`date`,t2.`precence`