php
  • regex
  • 2012-03-12 5 views 5 likes 
    5

    아래의 html 문자열에서 대괄호 안에 텍스트를 캡처하고 싶습니다. 하지만 내가 가지고있는 정규식은 '이미지'와 이미지 '를 별도로 얻지는 않지만'이미지를 반환합니다. ' "alt ="[이미지 대신]. 내가 alt = "[imagealt]"문자열을 꺼내면, 나는 기대하거나 원하는대로 반환합니다.대괄호 [] 내의 문자열 찾기

    $html = '<h2>[title]</h2> 
    <div class="content"><img src="[image]" alt="[imagealt]" /></div> 
    <div class="content">[text]</div>'; 
    
    preg_match_all("^\[(.*)\]^",$html,$fields, PREG_PATTERN_ORDER); 
    
    echo "<pre>"; 
    print_r($fields); 
    echo "</pre>"; 
    
    
    Array 
    (
        [0] => Array 
         (
          [0] => [title] 
          [1] => [image]" alt="[imagealt] 
          [2] => [text] 
         ) 
    
        [1] => Array 
         (
          [0] => title 
          [1] => image]" alt="[imagealt 
          [2] => text 
         ) 
    
    ) 
    

    답변

    7

    이 정규식 욕심되어 발견 된 후 중지됩니다. 당신은 당신이 원하는 것을하기를 욕심 내지 마셔야합니다. 탐욕에 대해 좀 더 알아보십시오 here.

    일치 항목이 욕심이 많은 경우 정규식을 만족하는 첫 번째 상황을 무시하고 최대한 많은 입력을 소비 할 때까지 계속 일치를 시도합니다.

    보통 이것은 ?을 추가하는 것을 포함하지만 나는 PHP에서 확실하지 않다,하지만 당신은 시도 할 수 : 문자열의 시작을 표시하기위한

    preg_match_all("^\[(.*?)\]^",$html,$fields, PREG_PATTERN_ORDER); 
    
    3

    사용

     preg_match_all("^\[(.*?)\]^",$html,$fields, PREG_PATTERN_ORDER); 
    

    여분 ? 의미 "비 욕심 일치"그것은 ]

    5
    preg_match_all("#\[[^\]]*\]#",$html,$fields, PREG_PATTERN_ORDER); 
    

    ^ 캐럿이 사용된다, 그래서 사용 혼동을 피하기 위해 구분 기호로 # 또는 |을 입력하십시오. 또한 ]의 끝에 도달하면 멈추기 때문에 .*? 대신 [^\]*]을 사용합니다. .에 게으른 수정자가 필요하고, m 수정 자도 필요하므로 속성에 포함 할 경우 줄 바꿈을 캡처 할 수 있습니다. 그들.

    관련 문제