2014-11-05 80 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; 
}