我在字符串中有一个完整的mysql查询,在该查询字符串的Where
子句中我定义了一些变量名称,我应该用从接口传递的值替换它们,但是如果用户没有填充任何过滤器,我应该用1
替换查询中的整个相关子语句。
假设我有一个名为provinces_province_code
的表单中的html select元素,以及查询中的相同字符串。
我开发了以下代码块来从查询中删除多余的空格,并在where
之后获取所有字符串。此处$nput_key
为provinces_province_code
,$input_val
为select元素的值(0,01,02,....等等)'。我已检查$input_val
是否为0
,然后我应将users.province_code = provinces_province_code
替换为1
。
if (preg_match('/= ' . $input_key . ' /', trim(preg_replace('/\s+/', ' ', $main_query))) or preg_match('/=' . $input_key . '/', trim(preg_replace('/\s+/', ' ', $main_query))) or preg_match('/= \'' . $input_key . '\'/', trim(preg_replace('/\s+/', ' ', $main_query))) or preg_match('/=\'' . $input_key . '\'/', trim(preg_replace('/\s+/', ' ', $main_query))) or preg_match('/= "' . $input_key . '"/', trim(preg_replace('/\s+/', ' ', $main_query))) or preg_match('/="' . $input_key . '"/', trim(preg_replace('/\s+/', ' ', $main_query)))) {
if($input_val == 0){
$main_query = preg_replace('/ where /', ' WHERE ', $main_query);
$main_query = preg_replace('/ Where /', ' WHERE ', $main_query);
$separatedByWhere = explode("WHERE", $main_query);
$last_where_clause = end($separatedByWhere);
我在tild,single/double quatation
之前和之后删除了所有province_province_code
。
$string = preg_replace('/\`'.$prm_val.'\`/', $prm_val, $last_where_clause);
$string = preg_replace('/\''.$prm_val.'\'/', $prm_val, $string);
$string = preg_replace('/\"'.$prm_val.'\"/', $prm_val, $string);
$string = preg_replace('/\"'.$prm_key.'\"/', $prm_val, $string);
$string = preg_replace('/\"'.$prm_key.'\"/', $prm_val, $string);
$string = preg_replace('/\"'.$prm_key.'\"/', $prm_val, $string);
现在我想定义start和string的结尾并调用另一个函数来获取这些字符串之间发生的所有子字符串,在我的条件中,字符串的结尾始终是我用作过滤器的{html元素的名称{{1} },但字符串的开头是未知的,我需要做的是,我应该在(provinces_province_code)
之前得到第一个出现的单词,将其用作= $end_string
。
$start_string
:
$string is
现在我检查了users.district_code IS NOT NULL AND users.district_code <> '' AND users.province_code = srs.province_code AND users.province_code = provinces_province_code
GROUP BY users.district_code
$start_string = '';
$end_string = $prm_val;
$statment2beReplaced = self::get_string_between($string, $start_string, $end_string);
$statment2beReplaced = preg_replace('/ and /', ' AND ',$statment2beReplaced);
if(preg_match('/ AND /',$statment2beReplaced)){
$searchString = $statment2beReplaced.''.$prm_val;
$statment2beReplaced = preg_replace('/'.$prm_key.' =/',1,$statment2beReplaced);
$string = preg_replace('/'.$searchString.'/',$statment2beReplaced,$string);
}
else {
$string = preg_replace('/' . $prm_key . $statment2beReplaced . $end_string . '/', 1, $string);
}
$separatedByWhere[key($separatedByWhere)] = $string;
$main_query = implode('WHERE', $separatedByWhere);
}
是否存在于字符串上方
1-如果存在,我想在provinces_province_code
users.province_code`之前得到第一个单词。
问题是现在,我怎么能得到它?
谢谢你的帮助。
答案 0 :(得分:0)
对不起,我对了解preg_match不是很了解,所以我会把字符串爆炸成一个类似的数组: -
<?php
$string = "users.district_code IS NOT NULL AND users.district_code <> '' AND users.province_code = srs.province_code AND users.province_code = provinces_province_code GROUP BY users.district_code";
$subs = explode(" ", $string);
foreach ($subs as $item) {
echo "<li>$item</li>";
}
?>
然后根据您使用的分隔符以及字符串的格式,您可以搜索数组并找到前面的单词。例如,在上面的例子中,因为前面的单词是由space = space分隔的,所以它总是在2行之前(=也将被视为一个单词)。或者你可以剥离=,它将是之前的行。这假设每个单词前面都有一个空格并以空格结束