如何REGEX一个url和autoadd [url]标签并修复重复

时间:2014-11-05 10:27:19

标签: php regex bbcode

我需要一个自动添加bbcode的功能。

  1. 用户使用我的编辑器输入内容。
  2. 提交后,将运行一个autolink()php函数。
  3. 如果内容文字有网址,则会自动添加[url] xxx [/ url]
  4. 我能做到。但是bbcode编辑器可能使用2格式网址

    一个。 [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://)[-a-zA-Z0-9@:%_/+.~#?&//=]+)','[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]
    

3 个答案:

答案 0 :(得分:2)

我尝试过更简单的事情:

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

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

    return $str;
}

答案 1 :(得分:0)

没有协议检查的[图像]处理代码:

<?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?://
            [-a-z0-9@:%_/+.~#?&=]+
        )
        (?:\[/url\])?
    )xi';

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

    $pattern ='(
        (?:\[img\])
        ([-a-z0-9@:%_/+.~#?&=]+)
        (?:\[/img\])
    )xi';

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

    return $str;
}

答案 2 :(得分:0)

谢谢jmleroux

这段代码编辑形成了你的答案,这是我的意思。

非常感谢!

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

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

    $pattern ='(
        (?:\[img\])
        ([-a-z0-9@:%_/+.~#?&=]+)
        (?:\[/img\])
    )xi';

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

    return $str;
}