2017-02-15 14 views
1

2202435에서 해결책을 사용하고 있습니다. 그러나 문자열에 대괄호를 추가하면 배열에 올바른 결과가 제공되지 않습니다.PHP는 문자열을 폭발 시키지만 따옴표로 묶인 단어는 하나의 단어로 취급하고 대괄호는 무시합니다.

$text = 'Lorem ipsum ("dolor sit amet") consectetur "adipiscing \\"elit" dolor'; 
preg_match_all('/"(?:\\\\.|[^\\\\"])*"|\S+/', $text, $matches); 
print_r($matches); 

('위의 코드는

Array 
(
    [0] => Array 
     (
      [0] => Lorem 
      [1] => ipsum 
      [2] => ("dolor 
      [3] => sit 
      [4] => amet") 
      [5] => consectetur 
      [6] => "adipiscing \"elit" 
      [7] => dolor 
     ) 

) 

을 생산하지만 찾고 있어요 결과는 내가 뒤에 공백을 포함하는 경우, 위의 결과를 얻을 수 있어요

Array 
(
    [0] => Array 
     (
      [0] => Lorem 
      [1] => ipsum 
      [2] => (
      [3] => "dolor sit amet" 
      [4] =>) 
      [5] => consectetur 
      [6] => "adipiscing \"elit" 
      [7] => dolor 
     ) 

) 

입니다 '앞에') '.

가능한 경우 설명이 포함 된 대괄호를 계속 사용할 수있는 올바른 정규 표현식을 알려주십시오.

감사합니다.

+0

그 이유는 당신이'독립' "유지하기위한 것입니다 사용하는 정규식 일치하면 일치 할 수 있습니다. "/"(? : \\\\. | [^ \\\\ "]) *"| [^ \ s "] +/''도움이 될 것입니다 –

+0

언 이스케이프 된 이중 따옴표는 입력 내용과 항상 쌍을 이루는가? –

+0

@ WiktorStribiżew 고맙다. 당신의 해결책이 효과적이다. uble 따옴표는 데이터베이스를 질의하기위한 검색 문자열의 일부이므로 항상 쌍을 지어야합니다. 작은 따옴표 안에 단어를 큰 따옴표와 함께 한 단어로 포함 할 수 있습니까? –

답변

0

당신이 사용하는 정규식은 독립 실행 형 "을 일치시키기 위해 사용됩니다. 당신은 이스케이프 따옴표는 항상 귀하의 의견에 짝 확실한 경우

'/"(?:\\\\.|[^\\\\"])*"|[^\s"]+/' 
         ^^^^^^ 

부정적인 문자 클래스 [^\s]로 돌려 \S에서 "을 제외하고 내부의 큰 따옴표를 추가 사용합니다.

는 참조

'~"(?:\\\\.|[^\\\\"])*"|\'(?:\\\\.|[^\\\\\'])*\'|[^\s"\']+~' 

사용할 수 있습니다, 하나의 인용 문자열을 포함하도록 regex demoPHP demo :

$re = '~"(?:\\\\.|[^\\\\"])*"|\'(?:\\\\.|[^\\\\\'])*\'|[^\s"\']+~'; 
$str = 'Lorem ipsum ("dolor sit amet") consectetur "adipiscing \\"elit" dolor \'something \\\'here\''; 
preg_match_all($re, $str, $matches); 
print_r($matches[0]); 
// => Array ([0] => Lorem [1] => ipsum [2] => ([3] => "dolor sit amet" [4] =>) 
// [5] => consectetur [6] => "adipiscing \"elit" [7] => dolor [8] => 'something \'here') 
+0

이 작동하지만 \ 'apple \\\'s \ '문자열을 이스케이프 처리하는 방법을 모르겠습니다. –

+0

탈출이란 무엇입니까? PHP 코드를 문자열 리터럴로 사용 하시겠습니까? ''apple \ 's ''은'$ s = "apple \\'s '"로 정의되어야합니다; –

+0

addslashes ("'apple 's '"); 기본적으로 \ 'apple \'s \ '이 (가) 반환됩니다. 값이 게시 된 변수 –