정규 표현식을 사용하여 여러 SQL 문과 대체 구분 기호/주석이 포함 된 파일에서 단일 sql 문을 추출하려고합니다.PCRE regex, 다양한 구분 기호 및 스트립 주석을 사용하여 여러 개의 명령문을 포함하는 문자열에서 단일 SQL 문 추출
SQL 문을 분리하기 위해 다음 패턴을 일치시키려는 경우 개별 문을 분리 한 후 주석을 제거하십시오 : "delimiter (del) (비 공백 순서) (del (델) 또는 del) (del) " "(not;); "
첫 번째 패턴이 구분
에 대한 문자의 집합의 사용을 허용해야 내가 시도한 첫 번째 패턴과 일치하는 다음
"/\s*delimiter\s+(?<d>[^\s]+)\s*;?\s*(?<qstr>(((?!--|\g{d}).)+|--[^\R]*\R)*)\g{d}\s*;?/s"
첫 번째 패턴이 실패 할 경우
, 두 번째 패턴과 일치 시키려면 :"/\s*(?<qstr>(((?!--|;).)+|--[^\R]*\R)*);/s"
다음 중 하나라도 성공하면 fo 빈 문자열 llowing :
"delimiter $$
create table MovieDetail
(
imdbid varchar(32) primary key not null,
title varchar(512),
year int,
rated varchar(16),
released int,
runtime int,
director varchar(128),
writer varchar(12),
plot varchar(2048),
imageurl varchar(512),
rating float,
ratingcount int,
type varchar(64)
); $$
detect this text as a separate statement"
하는 첫 번째 일치가 있어야한다 :
"/--[^\n\r]*(?:\n|\r)*/"
내 문제는 preg_match에 아파치 충돌 난 다음 문자열의 첫 번째 2 정규 표현식 중 하나를 검색 할 때이다
"delimiter $$
create table MovieDetail
(
imdbid varchar(32) primary key not null,
title varchar(512),
year int,
rated varchar(16),
released int,
runtime int,
director varchar(128),
writer varchar(12),
plot varchar(2048),
imageurl varchar(512),
rating float,
ratingcount int,
type varchar(64)
); $$"
및 서브 패턴 <qstr>되어야
"create table MovieDetail
(
imdbid varchar(32) primary key not null,
title varchar(512),
year int,
rated varchar(16),
released int,
runtime int,
director varchar(128),
writer varchar(12),
plot varchar(2048),
imageurl varchar(512),
rating float,
ratingcount int,
type varchar(64)
)"
목표는 여러 SQL 문을 포함하는 문자열에서 첫 번째 sql 문을 추출하는 것입니다. 그런 다음 추출 된 명령문을 고려한 후 문자열에서 새 색인을 판별하고 해당 색인에서 다음 sql 문을 추출합니다. 목표는 내 스크립트가 여러 SQL 문을 포함하는 문자열에서 개별 SQL 문을 실행하여 각 문에 대한 개별 결과를 인쇄 할 수 있도록하는 것입니다 (오류/성공/쿼리 결과가있는 경우 가져 오기 결과). delimiter는 sql의 일부가 아니므로 스크립트에서 여러 SQL 문을 포함하는 트리거 나 SQL 저장 프로그램을 정의 할 수 있어야하지만 하나로서 취급해야합니다.
나는 이스케이프 시퀀스를 // like //와 //로 대체하려고 시도했지만 여전히 동일하게 충돌합니다. 나는 debugex.com에서 그들을 테스트 해 보았고 두 표현식이 모두 유효했다. 내가 아파치 2.4.17 및 PHP 5.6.23 (VC11 X86 32 비트 스레드 안전) + PEAR와 XAMPP를 사용하고 있습니다.
주요 업데이트 : 여러 줄 문자열에서 정규 표현식을 실행할 때만 오류가 발생하므로 문자열의 이진 데이터를 한 줄 바꾸기와 비교해보십시오. \ n 또는 \ 연구 \ n
내가 또한 정규식 표현은 위의 SQL 문자열 표현을 차지하지 않습니다 실현, 그래서 업데이트 된 정규식의는
"/\s*delimiter\s+(?<d>[^\s]+)\s*;?\s*(?<qstr>(((?!--|\g{d})[^'])+|'([^']|'')*'|--[^\R]*\R)*)\g{d}\s*;?/sA"
및
"/\s*(?<qstr>((?!--|;)[^']|'([^']|'')*'|--[^\R]*\R)*);/sA"
있습니다충돌이 여러 공백 문자와 관련됩니다. 내가한다면
preg_replace("/\s+/", " ", $sqlstr);
크래시가 제거되고 제대로 작동합니다. 또한, 내가한다면
preg_replace("/[ ]+/", " ", preg_replace("/\R+/", "\n", $sqlstr));
충돌도 제거됩니다. 해결 방법으로 사용할 수는 있지만 원래 문자열을 보존하지 않기 때문에 마음에 들지 않습니다. 인덱스가 수정되지 않은 원래 문자열과 일치하므로 후속 SQL 문을 추출하는 데 문제가 발생할 수도 있습니다.
목표가 무엇인지 모르겠다. 하나 이상의 예를 제공하고 각각에 대해 원하는 출력을 제공하십시오. –