php
  • regex
  • html-parsing
  • 2012-03-13 2 views 1 likes 
    1

    좋아요, 비슷한 질문이 몇조각 있다는 것을 압니다 만, 저는 이것을 성취하기가 정말로 어렵습니다. 나는이 형식의 일부 문자열이 : 나는 File: 후 주어진 ID를 얻고 또 다른 문자열로 전체 [File:xxx]을 대체하기 위해 노력하고있어PHP 부분 문자열을 정규식으로 바꿉니다

    $x = '<iframe src="[File:19]"></iframe>'; 
    $y = '<img src=[File:2212] />'; 
    $z = '<source src="[File:42]" />'; 
    

    . 다음과 같은 노력하고있어,하지만 난 완전히 preg_replace의 사용법을 이해할 수없는 것 같습니다.

    $file = ('<iframe src="[File:134]"></frame>'); 
    $rex = "/^.*(\[File:[0-9]{1,}\])/i" ; 
    if (preg_match($rex, $file, $match)) { 
        echo 'OK'; 
    } 
    $file = preg_replace ($rex, "http://lala.com/la.pdf", $file); 
    echo "<br>".htmlentities($file)."<br>"; 
    

    내가 할 수있는 방법에 대한 힌트를 제공해 주시겠습니까? 사전에

    감사합니다.

    +1

    당신은'preg_match_all'을 사용하고'^. *'.. (작동해야합니다) **를 삭제할 수 있습니다 ** 실제로 ** [PHP DOM] (http://www.php.net/manual/ko/)을 사용해야합니다. book.dom.php) – noob

    답변

    1

    이 트릭 수행해야합니다 :

    그것은으로 다시 작성할 수 있습니다

    preg_match('/\[File:(\d+)\]/i', $str, $match)

    $ 일치 [0] 전체 문자열이됩니다, $ 일치 [1]해야합니다 그냥 번호.
    정규 표현식 일치 후 str_replace을 사용하여 문자열에서 $ match [0]을 제거 할 수 있습니다.

    예 :

    $x = '<iframe src="[File:19]"></iframe>'; 
    preg_match('/\[File:(\d+)\]/i', $x, $match); 
    var_dump($match); 
    

    을 제공합니다 :

    array(2) { 
        [0]=> 
        string(9) "[File:19]" 
        [1]=> 
        string(2) "19" 
    } 
    
    1

    변경이 2 줄

    $rex = "/^.*(\[File:[0-9]{1,}\])/i" ; 
    
    $file = preg_replace ($rex, "http://lala.com/la.pdf", $file); 
    

    에 :

    $rex = "/^(.*)\[File:[0-9]{1,}\]/i" ; 
    
    $file = preg_replace ($rex, "$1http://lala.com/la.pdf", $file); 
    

    이 앞에 (즉 $1을)이 그룹을 추가 한 후 교체 부분에서 1 군으로 [File...] 전에 무엇 캡처 대체 문자열의.

    $rex = "/\[File:\d+\]/i" ; 
    
    $file = preg_replace ($rex, "http://lala.com/la.pdf", $file); 
    
    +1

    나만인가, 아니면'/^(. *) \ [File'는 매우 쓸모없는 것이 아니라 퍼포먼스에 좋지 않은가요? '/^.* \ [File /''/ \ [File', 그것은하지 않습니까? 정규식에서 캡처하지 않으면 바꿀 필요가 없습니다. 맞습니까? –

    +0

    @BerryLangerak : 예, 맞습니다. 방금 OP의 정규식을 최소한으로 변경했습니다. – Toto

    +0

    아, 설명해줍니다. –

    1

    이 작동합니다 :

    <?php 
    $formats[] = '<iframe src="[File:19]"></iframe>'; 
    $formats[] = '<img src=[File:2212] />'; 
    $formats[] = '<source src="[File:42]" />'; 
    
    
    foreach($formats as $format) { 
    
        $regex = '~\[File:(\d+)\]~'; 
    
        $replace = function($matches) { 
         return 'http://lala.com/la.pdf?id=' . $matches[1]; 
        }; 
    
        var_dump(preg_replace_callback($regex, $replace, $format)); 
    } 
    

    을 나는 교체 람다를 만든, 내가 원하는 느낌을 가지고 있기 때문에 그 ID를 그냥 버리는 대신 File: 다음에 사용하십시오. 그걸 가지고 놀아 라. 질문이 있으시면 알려주십시오.

    +0

    괄호 안에 전체 표현식을 캡처 할 필요는 없습니다. 기본적으로 일치하는 전체 영역은 $ matches [0]에 저장됩니다. –

    +0

    @GigaWatt 충분합니다. –

    관련 문제