2016-09-28 3 views
0

문자열에서 완전한 mysql 쿼리 Where 그 쿼리 문자열의 조항 내가 매개 변수를 전달한 값으로 대체해야하는 일부 변수 이름을 정의했지만 사용자가 필터를 채우지 않으면 전체를 대체해야합니다. 쿼리 내의 관련 하위 문 1. 양식에 provinces_province_code이라는 html select 요소가 있고 쿼리 내에 같은 문자열이 있다고 가정합니다. 나는 쿼리에서 여분의 공백을 제거하고 where 뒤에 모든 문자열을 가져 오도록 벨로우즈 코드 블록을 개발했습니다. 여기서 $nput_keyprovinces_province_code이고 $input_val은 선택 요소 '(0,01,02, .... 등)의 값입니다. $input_val0인지 확인한 다음 users.province_code = provinces_province_code1으로 대체해야합니다.PHP 특정 키워드 이전에 발생한 공백없이 첫 단어를 얻는 방법?

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); 

는 여기 전과 province_province_code의 후 모든 tild,single/double quatation을 제거했습니다.

 $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); 

가 지금은 모든 하위 문자열이 그 문자열 사이에 발생한 얻을 시작하고, 문자열의 끝을 정의하고 다른 함수를 호출 할, 내 기준에서 문자열의 끝은 항상 html 요소 필터로 전 사용자의 이름입니다 (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); 
} 

지금은 provinces_province_code 그렇게 존재한다면, 내가 첫 번째 단어를 얻으려면 내부 문자열 이상 여부를 1 존재하는 것을 확인했다

= provinces_province_code, which in above string its users.province_code` 전에 발생했습니다. 질문은 이제 어떻게됩니까? 어떤 도움을 주셔서 감사합니다.

+0

@Anant'preg_match()'에서'provinces_province_code'를 찾기 위해 사용했지만'= 이전에 발생한 첫 단어를 얻는 방법을 찾지 못했습니다. provinces_province_code' – jones

+0

귀하의 질문에 귀하의 노력을 기울여야합니다. 그렇지 않으면 마킹에 직면하게 될 것입니다. –

+0

단어를 정의하는 것은 무엇입니까? 2 개의 공백 사이의 문자열, 2 = 사이의 문자열,? – kerry

답변

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로 분리되어 있기 때문에 항상 앞의 두 줄이됩니다 (=는 단어로 간주됩니다). 또는 당신은 =를 벗을 수 있고 전에 행이 될 것입니다. 이것은 각 단어가 공백으로 끝나고 공백으로 끝났다고 가정합니다.

관련 문제