php
  • regex
  • preg-match-all
  • 2011-04-14 3 views 0 likes 
    0

    나는 두 가지를 결합 할 수있는 방법을 으로, preg_match_all 구문 문제

    $first = '/>http:\/\/www.(.*?)\/(.*?)\</'; 
    $second = '/="http:\/\/www.(.*?)\/(.*?)"/'; 
    

    같은 것을 찾아야 페이지에서와는 preg_match 구문

    에 문제가 있습니까? 하지 죄송합니다

    $regex = '/(?="|>)http:\/\/www.(.*?)/(.*?)(?"|\<)/'; 
    

    이 매우 좋은 같은

    뭔가.

    이 나에게 잘 대해 보이는

    답변

    0

    :

    /(?:="|>)http:\/\/www\.(.*?)\/(.*?)["<]/i 
    

    주의 사항 몇 가지 사소한 수정에게 : 귀하의 비 캡처 그룹 구문 (대신 (?pattern)(?:pattern)을해야한다) 조금을, 그리고 당신은 또한 탈출하는 데 필요한 ./

    나는 또한 (.*?)\/(.*?)이 정확히 무엇을하고 있는지 잘 모르겠다. / 문자가 필요하지 않으면 나는 단지 (.*?)으로 바꿀 것입니다.

    0

    여기 재미있는 생각입니다.

    /(?:(=")|>)http:\/\/www\.(.*?)\/(.*?)(?(1)"|<)/sg 루핑을 사용하여 다음 찾기를 사용하십시오. 매번 변수 $ 2 및 $ 3을 추출합니다. 이것은 조건부를 사용합니다.

    또는 /(?|(?<==")http:\/\/www\.(.*?)\/(.*?)(?=")|(?<=>)http:\/\/www\.(.*?)\/(.*?)(?=<))/sg을 모두 사용하십시오. 이것은 분기 재설정을 사용합니다. 배열은 쌍으로 점증합니다 ($ cnt ++ % 2).

    결합하여 의미하는 바에 따라 다릅니다.

    펄 테스트 케이스 :

    use strict; 
    use warnings; 
    
    my $str = ' 
    <tag asdf="http://www.some.com/directory"/> 
    <dadr>http://www.adif.com/dir</dadr> 
    '; 
    
    while ($str =~ /(?:(=")|>)http:\/\/www\.(.*?)\/(.*?)(?(1)"|<)/sg) 
    { 
        print "'$2' '$3'\n"; 
    } 
    print "--------------\n"; 
    
    my @parts = $str =~ /(?|(?<==")http:\/\/www\.(.*?)\/(.*?)(?=")|(?<=>)http:\/\/www\.(.*?)\/(.*?)(?=<))/sg; 
    my $cnt = 0; 
    
    for (@parts) 
    { 
        print "'$_' "; 
        if ($cnt++ % 2) { 
         print "\n"; 
        } 
    } 
    __END__ 
    

    출력 :

    'some.com' 'directory' 
    'adif.com' 'dir' 
    -------------- 
    'some.com' 'directory' 
    'adif.com' 'dir' 
    
    관련 문제