2014-11-05 81 views
1

我需要一個函數來自動添加bbcode。如何REGEX一個url和autoadd [url]標籤並修復重複

  1. 用戶使用我的編輯器類型的東西。
  2. 提交後,會運行一個自動鏈接()php函數。
  3. 如果文字內容有URL將被自動添加[URL] XXX [/ URL]

我能做到這一點。但設置高亮編輯器也許使用2格式的URL

A. [URL] XX [/ URL] B. [URL = XXX] XXX [/ URL]

我無法修復重複的問題。這裏的演示代碼

$content=" 
http://www.google.com/logo.png 

[url]http://www.yahoo.com[/url] 

[url=http://yahoo.com/abc.zip]DownLoad[/url]"; 

$content = nl2br($content); 
echo linkAdd($content); 


    //auto add link 
    function linkAdd($content){ 

     preg_match_all('~\[url=((?:ftp|https?)://.*?)\](.*?)\[/url\]~s', $content, $stack);   
     foreach($stack[1] as $t) { 
      $content = preg_replace('~\[url=((?:ftp|https?)://.*?)\](.*?)\[/url\]~s','[url=\\1]\\2[/url]', $content,1); 
     } 

     preg_match_all('~\[url](.*?)\[/url\]~s', $content, $stack);   
     foreach($stack[1] as $t) { 
      $content = preg_replace('~\[url](.*?)\[/url\]~s',$t, $content,1); 
     } 

     $str=preg_replace('(((f|ht){1}tp://)[[email protected]:%_/+.~#?&//=]+)','[url]\\0[/url]',$content);   

     return $str; 
    } 

現在結果

[url]http://www.google.com/logo.png[/url] 

[url]http://www.yahoo.com[/url] 

[url=[url]http://yahoo.com/abc.zip[/url]]DownLoad[/url] 

線之一,線路二是確定。

但3號線再次重複[URL] XXX [/ URL]

how to be 
[url=[url]http://yahoo.com/abc.zip[/url]]DownLoad[/url] 
to 
[url=http://yahoo.com/abc.zip]DownLoad[/url] 

回答

0

代碼[IMG]處理而不協議檢查:

<?php 
$content="http://www.google.com/logo.png 
[url]http://www.yahoo.com[/url] 
[url=http://yahoo.com/abc.zip]DownLoad[/url] 
[img]google.com/logo.png[/img]"; 

//$content="[img]google.com/logo.png[/img]"; 

//$content = nl2br($content); 
echo linkAdd($content); 
echo PHP_EOL; 


//auto add link 
function linkAdd($content) 
{ 
    $pattern ='(
     (?:\[url\])? 
     (
      (?<!url=) 
      (?:f|ht)tps?:// 
      [[email protected]:%_/+.~#?&=]+ 
     ) 
     (?:\[/url\])? 
    )xi'; 

    $str=preg_replace($pattern,'[url]$1[/url]',$content); 

    $pattern ='(
     (?:\[img\]) 
     ([[email protected]:%_/+.~#?&=]+) 
     (?:\[/img\]) 
    )xi'; 

    $str=preg_replace($pattern,'[img][url]$1[/url][/img]',$content); 

    return $str; 
} 
2

我試着更簡單的東西:

function linkAdd($content) 
{ 
    $pattern ='(
    (?:\[url\])? 
    (
     (?<!url=) 
     (?:f|ht)tps?:// 
     [[email protected]:%_/+.~#?&=]+ 
    ) 
    (?:\[/url\])? 
    )xi'; 

    $str=preg_replace($pattern,'[url]\\1[/url]',$content); 

    return $str; 
} 
+0

哇!如此清晰和簡單的代碼。 我明白了,非常感謝你,jmleroux! – Sky 2014-11-05 13:33:39

+0

嗨,jmleroux。我想跳過[img]標籤,在「[-a-z0-9 @:%_/+。〜#」之後添加此代碼「〜\ [img \](。*?)\ [/ img \]〜s」 ?&=] +「爲什麼不工作?你能再幫助我嗎?謝謝。 – Sky 2014-11-06 09:37:05

+0

你能舉出輸入和預期輸出的例子嗎?如果使用你的代碼不能編輯,請使用 – jmleroux 2014-11-06 10:16:52

0

謝謝jmleroux

這段代碼編輯你的答案,這是我的意思。

非常感謝!

function linkAdd($content) 
{ 
    $pattern ='(
     (?:\[url\])? 
     (
      (?<!url=) 
      (?:f|ht)tps?:// 
      [[email protected]:%_/+.~#?&=]+ 
     ) 
     (?:\[/url\])? 
    )xi'; 

    $str=preg_replace($pattern,'[url]$1[/url]',$content); 

    $pattern ='(
     (?:\[img\]) 
     ([[email protected]:%_/+.~#?&=]+) 
     (?:\[/img\]) 
    )xi'; 

    $str=preg_replace($pattern,'[img]$1[/img]',$str); 

    return $str; 
}