2017-09-19 5 views
-1

인용 된 문자열 목록과 일치 시키려하고 인용 된 부분 문자열을 얻으려고합니다. PHP의 preg_match_all은 인용 문자열의 유효성을 검사하지만 반환 된 "$ matches"에는 인용 된 하위 문자열이 모두 포함되지 않습니다. 일반적으로 첫 번째와 마지막을 반환합니다.PHP에서 모든 일치 항목을 얻으려고 시도했습니다. preg_match_all

식의 구성 요소에 이름을 (?P<name>) 할당하려고 시도했지만 결과가 중복되어 나타나는 것으로 보입니다. 여전히 인용 된 하위 문자열을 모두받지 못합니다.

DEFINE을 사용하여 구성 요소의 서브 루틴을 작성해도 결과가 향상되지 않았습니다.

다음은 일치시키려는 입력의 예입니다.

'abcd','efgh"ij','list,543','Brown fox.','left(paren','right)paren' 

다음은 내가 사용하고있는 표현입니다. 문자열은 작은 따옴표로만 인용됩니다.

/(?x)^ (\x27[^\x27]*\x27) (,(\x27[^\x27]*\x27))* $/ 

처럼 preg_match_all에 대한 호출은 같습니다

$pregex = '/(?x)^ (\x27[^\x27]*\x27) (,(\x27[^\x27]*\x27))* $/'; 
echo 'Match result: '.preg_match_all($pregex, $text_list, $matches, PREG_PATTERN_ORDER)."\n"; 

실행 후, $ 일치

가 포함되어 있습니다. "브라운 여우"나는 문자열로 주목

Array 
(
    [0] => Array 
     (
      [0] => 'abcd','efgh"ij','list,543','Brownfox.','left(paren','right)paren' 
     ) 

    [1] => Array 
     (
      [0] => 'abcd' 
     ) 

    [2] => Array 
     (
      [0] => ,'right)paren' 
     ) 

    [3] => Array 
     (
      [0] => 'right)paren' 
     ) 

) 

을 ... "Brownfox."로 변경되었습니다. 문제가되며 인용 된 하위 문자열을 모두 나열하지 않습니다. 내가보고 싶은 무엇

이 (가 반환 된 문자열의 시작 부분에는 쉼표가 없지만, 그들이 거기이어야합니다, 그렇게 될 통지) 같은 것입니다 :

Array 
(
    [0] => Array 
     (
      [0] => 'abcd','efgh"ij','list,543','Brownfox.','left(paren','right)paren' 
     ) 

    [1] => Array 
     (
      [0] => 'abcd' 
     ) 

    [2] => Array 
     (
      [0] => 'efgh”ij' 
     ) 

    [3] => Array 
     (
      [0] => 'list,543' 
     ) 

    [3] => Array 
     (
      [0] => 'Brown fox.' 
     ) 

    [3] => Array 
     (
      [0] => 'left(paren' 
     ) 

    [3] => Array 
     (
      [0] => 'right)paren' 
     ) 

) 

것 같아요 내 질문은 :

  1. preg_match_all을 사용하여 원하는 것을 달성 할 수 있습니까?
  2. 가능하다면 무엇을 잘못하고 있습니까? 아니면 내가 이해하지 못하는 부분이 있습니까? ?
  3. 가능한 경우 파싱을 수행하려면 어떻게해야합니까?

고마워요!

+0

'$ string = explode (',', $ string); preg_match_all ("~ '([^')] $ string = array_map ('trim', $ string, array_fill (0, count ($ string), ''")); ' –

+0

또는 정규 표현식을 사용하고 싶다면, ] +) '~', $ string, $ matches); print_r ($ matches); ' –

+0

고마워! 나는 그것을 시도 할 것이다! 나는 "~"이 무엇인지 모르겠다. 그러나 나는 그것을 찾을 것이다. – John

답변

-1

많은 도움을 주신 Crayon Violent에게 감사드립니다. 그의 표현은 나의 문제를 해결했다.

부분 문자열에 하나 이상의 쉼표 (예 : 'efgh"ij','list,543','Brown fox')가 포함되어있는 것처럼 그가 제공 한 정규식 솔루션을 선택하면 "list,543" 하위 문자열의 쉼표가 파싱하여 구문 분석을 해제합니다.

원본 정규식은 입력의 유효성을 검사하는 훌륭한 역할을했지만 하위 문자열 배열을 제공하지 않았습니다.격렬한 제공 정규식 크레용 문자열의 배열을 제공한다, 그러나 입력을 확인하지 않으므로 내 용액에서와 같이, 모두를 사용할 수있다 :

$token_count = 0; 

// Trim leading and trailing blanks from the input. 
$trimmed_input_text = trim($text_input); 

// Validate the input using preg_match 
$pregex_validate = '/(?x)^ [ ]* \( [ ]* (\x27[^\x27]*\x27) ( [ ]* , [ ]* (\x27[^\x27]*\x27))* [ ]* \) [ ]* $/'; 
if (preg_match($pregex_validate, $trimmed_input_text)) { 
    // Use preg_match_all to get the substrings in an array 
    $pregex_parse = "~'([^']+)'~"; 
    $token_count = preg_match_all($pregex_parse, $trimmed_input_text, $matches); 
} 

생성 $matches 수율 :

Array 
(
    [0] => Array 
     (
      [0] => 'abcd' 
      [1] => 'efgh"ij' 
      [2] => 'list,543' 
      [3] => 'Brown fox.' 
      [4] => 'left(paren' 
      [5] => 'right)paren' 
     ) 

    [1] => Array 
     (
      [0] => abcd 
      [1] => efgh"ij 
      [2] => list,543 
      [3] => Brown fox. 
      [4] => left(paren 
      [5] => right)paren 
     ) 

) 

... 정확히 내가 원하는거야!

다시 한 번 도움을 주신 Crayon Violent에게 감사드립니다.

John

+0

정규식을 사용하면 시간 낭비 일뿐입니다.'str_getcsv (trim ($ str), ',', " '")'는 한 줄로 동일합니다. –

+0

우수! 감사! 그리고 쉼표가 포함 된 문자열을 올바르게 처리했습니다! 감사! PHP의 거의 20 년 동안 str_getcsv는 내가 실행하지 못했던 하나의 함수입니다. – John