Php如何在特定关键字之前获得没有空格的第一个单词?

时间:2016-09-28 04:32:49

标签: php regex

我在字符串中有一个完整的mysql查询,在该查询字符串的Where子句中我定义了一些变量名称,我应该用从接口传递的值替换它们,但是如果用户没有填充任何过滤器,我应该用1替换查询中的整个相关子语句。 假设我有一个名为provinces_province_code的表单中的html select元素,以及查询中的相同字符串。 我开发了以下代码块来从查询中删除多余的空格,并在where之后获取所有字符串。此处$nput_keyprovinces_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`之前得到第一个单词。 问题是现在,我怎么能得到它? 谢谢你的帮助。

1 个答案:

答案 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行之前(=也将被视为一个单词)。或者你可以剥离=,它将是之前的行。这假设每个单词前面都有一个空格并以空格结束