>

문자열을 공백으로 나눌 필요가 있지만 따옴표 안의 문구는 쪼개지지 않아야합니다. 예 :

 word1 word2 "this is a phrase" word3 word4 "this is a second phrase" word5

이것은 preg_split 뒤에 배열이되어야합니다 :

array(
 [0] => 'word1',
 [1] => 'word2',
 [2] => 'this is a phrase',
 [3] => 'word3',
 [4] => 'word4',
 [5] => 'this is a second phrase',
 [6]  => 'word5'
)

정규 표현식을 어떻게 작성해야합니까?

PS. 관련 질문 이 있지만 내 경우에는 효과가 있다고 생각합니다. 허용되는 답변은 공백 대신 단어를 찾기위한 정규 표현식을 제공합니다.

  • 답변 # 1

    #regex irc 채널 (irc.freenode.net) 솔루션의 사용자 MizardX의 도움으로 발견되었습니다. 작은 따옴표도 지원합니다.

    $str= 'word1 word2 \'this is a phrase\' word3 word4 "this is a second phrase" word5 word1 word2 "this is a phrase" word3 word4 "this is a second phrase" word5';
    $regexp = '/\G(?:"[^"]*"|\'[^\']*\'|[^"\'\s]+)*\K\s+/';
    $arr = preg_split($regexp, $str);
    print_r($arr);
    
    

    결과 :

    Array (
        [0] => word1
        [1] => word2
        [2] => 'this is a phrase'
        [3] => word3
        [4] => word4
        [5] => "this is a second phrase"
        [6] => word5
        [7] => word1
        [8] => word2
        [9] => "this is a phrase"
        [10] => word3
        [11] => word4
        [12] => "this is a second phrase"
        [13] => word5  
    )
    
    

    PS. 단점은이 정규 표현식이 PCRE 7에서만 작동한다는 것입니다.

    제작 서버에서 PCRE 7을 지원하지 않으며 PCRE 6 만 설치되어 있습니다. PCRE 7의 이전 버전만큼 유연하지는 않지만 정규 표현식이 작동합니다 (\ G 및 \ K 제거) :

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

    주어진 입력 결과는 위와 같습니다.

  • 답변 # 2

    따옴표가 잘 정의되어 있다고 가정하면 (즉, 쌍으로) 2 개의 필드마다 분해하여 for 루프를 진행할 수 있습니다. 예 :

    $str = "word1 word2 \"this is a phrase\" word3 word4 \"this is a second phrase\" word5 word6 \"lastword\"";
    print $str ."\n";
    $s = explode('"',$str);
    for($i=1;$i<count($s);$i+=2){
        if ( strpos($s[$i] ," ")!==FALSE) {
            print "Spaces found: $s[$i]\n";
        }
    }
    
    

    출력

    $ php test.php
    Spaces found: this is a phrase
    Spaces found: this is a second phrase
    
    

    복잡한 정규 표현식이 필요하지 않습니다.

  • 답변 # 3

    연결 한 다른 질문에서 정규식을 사용하는 것이 다소 쉬운가요?

    <?php
    $string = 'word1 word2 "this is a phrase" word3 word4 "this is a second phrase" word5';
    preg_match_all( '/(\w+|"[\w\s]*")+/' , $string , $matches );
    print_r( $matches[1] );
    ?>
    
    

    출력 :

    Array
    (
         [0] => word1
         [1] => word2
         [2] => "this is a phrase"
         [3] => word3
         [4] => word4
         [5] => "this is a second phrase"
         [6] => word5
    )
    
    

  • 답변 # 4

    토큰 화와 정규식을 벤치마킹하고 싶은 사람이 있습니까? 내 생각에 explode () 함수는 속도 이점을 위해 너무 무겁습니다. 그럼에도 불구하고 여기에 다른 방법이 있습니다 :

    (따옴표로 묶은 문자열을 저장하는 else 케이스를 잊어 버렸기 때문에 편집 됨)

    $str = 'word1 word2 "this is a phrase" word3 word4 "this is a second phrase" word5';
    // initialize storage array
    $arr = array();
    // initialize count
    $count = 0;
    // split on quote
    $tok = strtok($str, '"');
    while ($tok !== false) {
        // even operations not in quotes
        $arr = ($count % 2 == 0) ? 
                                   array_merge($arr, explode(' ', trim($tok))) :
                                   array_merge($arr, array(trim($tok)));
        $tok = strtok('"');
        ++$count;
    }
    // output results
    var_dump($arr);
    
    

  • 답변 # 5

    $test = 'word1 word2 "this is a phrase" word3 word4 "this is a second phrase" word5';
    preg_match_all( '/([^"\s]+)|("([^"]+)")/', $test, $matches);
    
    

  • 이전 wcf - MaxItemsInObjectGraph 오류를 수정하는 방법?
  • 다음 scala - Play 프레임 워크 및 buildsbt에서 애플리케이션 버전을 얻는 방법