php
  • preg-replace
  • bbcode
  • 2011-09-01 5 views 0 likes 
    0

    배열과 함께 preg_replace를 사용하여 bbcode를 탐색하고 뉴스 항목이 게시 될 때 변경하십시오. 나는 텍스트와 BBCode는 포함되어 있습니다 (이 예 $ newsPost에서) 데이터베이스에서 데이터를 가져 오는 경우 URL 값에 따라 bbcode를 변경하십시오.

    $bbcode = array (
        "/\[url\=(.*?)\](.*?)\[\/url\]/is" => "<a href='$1' target='_blank'>$2</a>" 
    ); 
    

    예를

    를 들어

    는 그럼, 나는이 작업을 수행.

    $newsPost = preg_replace(array_keys($bbcode), array_values($bbcode), $newsPost); 
    

    지금, 내가 원하는 것은 $ 1 값이 내 도메인이 포함 된 경우, 대상이 "정상"이어야하며 그렇지 않은 경우는 비어 있어야 알 수있다.

    그래서 우리는 [url=http://www.mydomain.com]visit our page[/url]이 있다면. 그러면 <a href="http://www.mydomain.com" target="top">visit our page</a>으로 변형되고 다른 것은 target="_blank"이됩니다.

    아이디어가 있으십니까?

    미리 감사드립니다.

    답변

    1

    편집/

  • 가 처음에 내가 (당신이 당신의 정규식에서 리터럴 백 슬래시를 원하는 경우는 문자열에 \\을해야합니다) 당신의 백 슬래시를 고정 도메인 이름에 점으로 처리

    • 추가 str_replace()을 고정 그러나 당신이 처음에 당신을 위해 일하고 있다고 말한대로 나는 이것을 취소했습니다. 이것에 대해

    어떻게? 그것이 당신을 위해 작동 할 경우

    $mydomain = 'domain.tld'; 
    $bbcode = array (
        "/\[url\=([^]]*)(".str_replace('.','\\.',$mydomain).")([^]]*)\]([^[]*)\[\/url\]/is" => "<a href='$1$2$3' target='top'>$4</a>", 
        "/\[url\]([^[]*)(".str_replace('.','\\.',$mydomain).")([^[]*)\[\/url\]/is" => "<a href='$1$2$3' target='top'>$1$2$3</a>"; 
        "/\[url\=([^]]*)\]([^[]*)\[\/url]/is" => "<a href='$1' target='_blank'>$2</a>" 
        "/\[url\]([^[]*)\[\/url\]/is" => "<a href='$1' target='_blank'>$1</a>", 
    ); 
    

    하는주의해야 할 점은 : 모든 하위 도메인을 잡을 수 있도록, domain.tld로 설정, www.domain.tld$mydomain을 설정하지 마십시오.

    당신은 이런 여러 도메인으로 그것을 할 수 :

    $mydomains = array(
        'domain.tld', 
        'anotherdomain.tld', 
        'sub.yetanotherdomain.tld' 
    ); 
    
    // Add domain-specific rules before general rules so we don't match domain 
    // specific links with the general link rule (we have replaced them by that point) 
    $domainrules = array(); 
    foreach ($mydomains as $domain) { 
        $domainrules["/\[url\=([^]]*)(".str_replace('.','\\.',$domain).")([^]]*)\]([^[]*)\[\/url\]/is"] = "<a href='$1$2$3' target='top'>$4</a>"; 
        $domainrules["/\[url\]([^[]*)(".str_replace('.','\\.',$domain).")([^[]*)\[\/url\]/is"] = "<a href='$1$2$3' target='top'>$1$2$3</a>"; 
    } 
    
    // This array contains all your static BBCode rules 
    $staticrules = array(
        "/\[url\=([^]]*)\]([^[]*)\[\/url\]/is" => "<a href='$1' target='_blank'>$2</a>", 
        "/\[url\]([^[]*)\[\/url\]/is" => "<a href='$1' target='_blank'>$1</a>", 
        "/\[b\]([^[]*)\[\/b\]/is" => "<span class='bold_text'>$1</span>", 
        ... 
    ); 
    
    // Make an array that contains all the rules 
    $bbcode = array_merge($staticrules,$domainrules); 
    
    +0

    완벽하게 일했다! 고맙습니다. 두 번째 예제에 대해 약간 확신 할 수 없습니다. bbcode (20+)에 많은 항목이있는 경우 $ bbcode [] 스타일에 맞게 각 항목을 다시 작성해야합니다. – Andelas

    +1

    @scatteredbomb 아니요, [array_merge()] (http://www.php.net/manual/en/function.array-merge.php)를 사용할 수 있습니다. 업데이트 된 답변 – DaveRandom

    +0

    @scatteredbomb을 방금 다시 편집했습니다. '[url] http : //my.url/ [/ url]'구문뿐만 아니라'[url = http : //my.url/] some text [/ url] 구문을 사용하여 사람들을 설명해야한다는 것을 깨달았습니다. ' – DaveRandom

     관련 문제

    • 관련 문제 없음^_^