문제

그래서 저는 적절한 테이블 접두사 (예 : "t."또는 "r.")로 유효한 열 이름을 자동으로 선출하는 스크립트를 작성하려고합니다.

$t_columns = array('id', 'name', 'label');
$r_columns = array('related_value');

입력:

id > 1 AND (name = 'Hello' OR label IN ('World', 'Planet name AND label')) AND (related_value > 1 AND related_value < 50)

산출:

t.id > 1 AND (t.name = 'Hello' OR t.label IN ('World', 'Planet name AND label')) AND (r.related_value > 1 AND r.related_value < 50)

정상을 어떻게 할 수 없는지 주목하십시오 str_replace. 가장 간단한 코드는 무엇입니까 (추측하고 있습니다 preg_replace) 모든 테이블 이름이 올바르게 선불되도록하기 위해?

도움이 되었습니까?

해결책

이것은 많은 방법으로 수행 할 수 있으며 Regex를 사용할 수도 있습니다. 나는 개인적으로 배열 접근법을 사용합니다. 우선, 나는 Mangling 테이블을 이런 식으로 정의 할 것입니다.

$table = array(
    'id' => 't.id',
    'name' => 't.name',
    'label' => 't.label',
    'related_value' => 'r.related_value'
);

이렇게하면 str_replace () 호출이 훨씬 쉬워집니다.

function mangling(&$v, $k, $table)
{
    if (($k & 1) == 0)
        $v = str_replace(array_keys($table), array_values($table), $v);
}

$spans = explode("'", ' ' . $input);
array_walk($spans, 'mangling', $table);
$output = implode("'", $spans);

다른 팁

몇 초만 생각 한 후에는 내가 어떻게 해결하는지 다음과 같습니다.

문자열, Char가 문자열을 걸어 가고, 단일 따옴표를 찾고 있지만 탈출 한 캐릭터를 건너 뛰십시오. 두 개의 에스카로운 단일 따옴표 (즉, 문자열) 사이의 내용은 고유 한 토큰으로 대체되어 해당 토큰을 키로 사용하고 원래 문자열을 값으로 연결합니다.

이제 우리는 끈을 벗어 났으므로 str_replace() (또는 preg_replace(), 당신이 주장하는 경우) 알려진 열 이름을 위해. 아마도 열 이름을 테이블의 별칭으로 키로 사용하고 열 이름을 포함하는 열거 배열로 값을 연관 배열로 구성 할 것입니다. 이렇게하면 교체가 자동화 될 수 있습니다.

테이블 이름이 채워지면 str_replace() 토큰의 경우 원래 문자열을 자신의 장소로 교체하면 완료됩니다.

나는 누군가가 한 번의 히트 로이 모든 것을하기 위해 매우 멋진 (그리고 아마도 인사 할 수없는 옆에있는) Regexp를 채찍질 할 것이라고 확신합니다. 그러나 CFL이 더 적합한 곳이 아닌 정규식이 실제로 올바른 도구 인 상황에서만 Regexps를 사용하는 것이 좋습니다.

정규 표현이 여기서 좋은 생각인지 모르겠습니다. PHP에서 자체 검증을 수행하기 위해 최소한의 증가 된 계산 복잡성의 가치가 있다고 말하고 싶습니다. 그런 다음 데이터베이스에 변경이 필요한 경우 정규 표현의 견고성을 높이는 방법에 대해 걱정하는 머리카락을 끌어 내지 않아도됩니다.

Jamie Zawinski가 한 번 말했듯이, "어떤 사람들은 문제에 직면했을 때 '나는 정기적 인 표현을 사용할 것입니다.'라고 생각합니다. 이제 그들은 두 가지 문제가 있습니다. "

올바른 데이터베이스에서 작업 할 수있는 워크 플로 생성 측면에서 객체 지향적 접근 방식을 취하는 것을 고려할 것입니다. T 및 R 테이블에 대한 클래스는 Regex가 아닌 동일한 방법 내에서 조건부 로직을 사용하여 올바른 테이블 유형 객체를 구축하는 모델 클래스의 인스턴스화 어린이 일 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top