2012-07-11 4 views
0

아래 정규식 (PHP 사용)을 만들었습니다. 이 문자열은 a-z0-9, ., _ 및 만을 포함하는 ALL terms과 일치해야합니다.정규식이 작동하지 않습니다.

내 표현은 '~(?:\(|\s{0,},\s{0,})([a-z0-9._-]+)(?:\s{0,},\s{0,}|\))$~i'입니다.

내 대상 문자열은 ('word', word.2, a_word, another-word)입니다. 결과에 terms가 표시됩니다 : word.2, a_word, another-word입니다.

현재 받고있는 숫자는 another-word입니다.

내 목표 문자열에서 MySQL의 기능을 검출하고

내 목표는,이 잘 작동합니다. 그런 다음 해당 대상 문자열 내에서 모든 필드를 원합니다. 그것은 내 자신의 ORM을위한 것입니다.

다음 표현식 안에 더 많은 괄호가 포함되어있을 수 있다고 생각합니다.

+0

힌트 :'{0,}'은'*'와 같습니다. – deceze

+0

괄호 안의 어떤 용어라도 따옴표로 묶을 수 있습니까? 임의의 수의 인용 된 용어가있을 수 있습니까? 어쩌면 우리는 당신의 의견을 몇 가지 더 보여줄 수 있습니다. – Flimzy

+1

또한 중첩 된 괄호를 처리해야합니까? 모든 괄호가 항상 올바르게 균형을 잡을 수 있습니까? 따옴표로 묶인 문자열 안에 괄호를 사용할 수 있습니까? 따옴표로 묶인 문자열 안에 (이스케이프 또는 다른) 따옴표가 올 수 있습니까? 정규식에서이를 처리하도록하려면 이러한 문제를 해결해야합니다. –

답변

1

내가 알 수있는 것부터 쉼표로 구분 된 단어 목록을 가지고 있으며 [a-z0-9._\-]+을 만족하는 단어 만 찾으려고합니다. 그렇다면,이 (가 적어도 당신의 예를 들어 올바른 결과를 반환) 정확해야 :

'~(?<=[,(])\\s*([a-z0-9._-]+)\\s*(?=[,)])~i' 

주요 이슈했다 :

  • $받는 쿼리를 고정 된 끝에서 문자열의 끝
  • 모두 일치하는 경우 이전 경기의 끝에서 계속됩니다. 즉, 한 경기가 끝나면 쉼표/​​닫기 괄호와 일치하는 경우 다음 경기가 시작될 때 일치하지 않습니다. lookbehind ((?<=...)와 lookahead ((?=...)로 해결했습니다.
  • 문자열을 구문 분석 할 때 첫 번째 문자열이 PHP에서 제거 될 수 있으므로 백 슬래시를 두 번 이스케이프해야합니다.

편집 : 당신은 몇 가지 용어이를 먼저 입력을 실행하는 것이 좋습니다 쉼표가 포함 된 문자열이 될 수 있다는 의견에 말했다 이후 :

$input = preg_replace('~(\'([^\']+|(?<=\\\\)\')+\'|"([^"]+|(?<=\\\\)")+")~', '"STRING"', $input); 

하는 모든 문자열을 교체해야하는 ''STRING " '을 사용하면 다른 정규 표현식과의 일치를 위해 잘 작동합니다.

+0

명확한 응답을 주셔서 감사합니다, 내가 그랬던 것보다 더 나은 정규 표현식을 이해해 주셔서 감사합니다. – ash

1

어쩌면 정규식을 사용하면 잔인합니다. 이런 종류의 텍스트에서는 괄호를 제거하고 문자열을 쉼표로 구분할 수 있습니다.

+1

수정하십시오. 정규 표현식'([^)] *)'을 사용하여 문자열의 괄호 안의 전체 부분을 일치시킨 다음 평범한 구형 문자열 함수 인'explode'와 friends를 사용하여 나머지를 처리합니다. –

+0

따옴표로 묶은 문자열에 쉼표가 있으면 어떻게됩니까? –

+0

글쎄, 그는 자신의 끈에 나타날 수있는 것이 무엇인지를 알아야한다. 당신이 할 수있는 경우 내 포인트 정규 표현식을 방지하는 것입니다. – drupality

관련 문제