0

我遇到了RegEx用纯文本替换 URL(不是超链接)的出色“小程序”。唯一的问题是我对 RegEx 知之甚少,所以我完全坚持让这个为我的博客工作。

因此,我正在寻求排除 URL 的帮助,例如,$exception_url = 'http://mysite.com'

function strip_urls($text, $xception_url = FALSE)
{
    return preg_replace("/( (?:
    (?:https?|ftp) : \\/*
    (?:
        (?: (?: [a-zA-Z0-9-]{2,} \\. )+
            (?: arpa | com | org | net | edu | gov | mil | int | [a-z]{2}
                | aero | biz | coop | info | museum | name | pro
                | example | invalid | localhost | test | local | onion | swift ) )
        | (?: [0-9]{1,3} \\. [0-9]{1,3} \\. [0-9]{1,3} \\. [0-9]{1,3} )
        | (?: [0-9A-Fa-f:]+ : [0-9A-Fa-f]{1,4} )
    )
    (?: : [0-9]+ )?
    (?! [a-zA-Z0-9.:-] )
    (?:
        \\/
        [^&?#\\(\\)\\[\\]\\{\\}<>\\'\\\"\\x00-\\x20\\x7F-\\xFF]*
    )?
    (?:
        [?#]
        [^\\(\\)\\[\\]\\{\\}<>\\'\\\"\\x00-\\x20\\x7F-\\xFF]+
    )?
) | (?:
    (?:
        (?: (?: [a-zA-Z0-9-]{2,} \\. )+
            (?: arpa | com | org | net | edu | gov | mil | int | [a-z]{2}
                | aero | biz | coop | info | museum | name | pro
                | example | invalid | localhost | test | local | onion | swift ) )
        | (?: [0-9]{1,3} \\. [0-9]{1,3} \\. [0-9]{1,3} \\. [0-9]{1,3} )
    )
    (?: : [0-9]+ )?
    (?! [a-zA-Z0-9.:-] )
    (?:
        \\/
        [^&?#\\(\\)\\[\\]\\{\\}<>\\'\\\"\\x00-\\x20\\x7F-\\xFF]*
    )?
    (?:
        [?#]
        [^\\(\\)\\[\\]\\{\\}<>\\'\\\"\\x00-\\x20\\x7F-\\xFF]+
    )?
) | (?:
    [a-zA-Z0-9._-]{2,} @
    (?:
        (?: (?: [a-zA-Z0-9-]{2,} \\. )+
            (?: arpa | com | org | net | edu | gov | mil | int | [a-z]{2}
                | aero | biz | coop | info | museum | name | pro
                | example | invalid | localhost | test | local | onion | swift ) )
        | (?: [0-9]{1,3} \\. [0-9]{1,3} \\. [0-9]{1,3} \\. [0-9]{1,3} )
    )
) )/Dx", '', $text);
}

非常感谢您的回答,谢谢。

4

2 回答 2

2

更改正则表达式几乎是不可能的,并且最终会变得巨大。

但是,您可以暂时用一些虚假字符串替换异常 URL 中将其标识为 URL 的部分,然后在正则表达式之后将它们替换回来(如果您真的想要偏执,您可以确保替换字符串不t 已经存在于文本中(或者在 URL 剥离后不存在),如果存在,则附加一个随机数,直到它们不存在):

$identifier = '.com';
$temp_replace = '@@@STRIP_URLS-COM@@@';
$identifier2 = '://';
$temp_replace2 = '@@@STRIP_URLS-SLASHES@@@';
if ($exception_url) {
    $text = str_replace($exception_url, str_replace(array($identifier, $identifier2), array($temp_replace, $temp_replace2), $exception_url), $text);
}

$text = preg_replace(...)
....rest of regex here...

if ($exception_url) {
    $text = str_replace(array($temp_replace, $temp_replace2), array($identifier, $identifier2), $text);
}
return $text;
于 2012-08-26T00:54:48.970 回答
0

我相信有人会发现这很有用。

您可以指定一个相对 URL,即允许来自您网站的 URL:

strip_urls($blog_comment, 'http://www.mysite.com/');

来自一组合作伙伴域:

strip_url($blog_comment, array('http://mysite.com/', 'http://partner.com/', 'http://partner1.com/')).

使用 Mihai Loga 使用占位符的想法,我修改了初始脚本以将数组或字符串作为 $exception_url。我还制作了占位符以使其更安全。

function strip_urls($text, $exception_url = array())
{
    if( ! empty($exception_url))
    {
    if(is_string($exception_url)) $exception_url = array($exception_url);

$placeholder_array = array();
$placeholder = md5(uniqid());

if(strpos($text, $placeholder))
{
    while(strpos($text, $placeholder))
    {
    $placeholder = md5(uniqid());
    }
}

for($i = 0; $i < count($exception_url); $i++)
{
    if( ! is_string($exception_url[$i]))
    {
    unset($exception_url[$i]);
    $exception_url = array_values($exception_url);
    continue;
    }

    $pos = mb_strpos($text, $exception_url[$i]);

    if (FALSE === $pos) continue;

    $text = substr_replace($text, $placeholder + $i, $pos, mb_strlen($exception_url[$i]));
    $placeholder_array[] = $placeholder + $i;
}
}

$text = preg_replace("/( (?:
    (?:https?|ftp) : \\/*
    (?:
        (?: (?: [a-zA-Z0-9-]{2,} \\. )+
            (?: arpa | com | org | net | edu | gov | mil | int | [a-z]{2}
                | aero | biz | coop | info | museum | name | pro
                | example | invalid | localhost | test | local | onion | swift ) )
        | (?: [0-9]{1,3} \\. [0-9]{1,3} \\. [0-9]{1,3} \\. [0-9]{1,3} )
        | (?: [0-9A-Fa-f:]+ : [0-9A-Fa-f]{1,4} )
    )
    (?: : [0-9]+ )?
    (?! [a-zA-Z0-9.:-] )
    (?:
        \\/
        [^&?#\\(\\)\\[\\]\\{\\}<>\\'\\\"\\x00-\\x20\\x7F-\\xFF]*
    )?
    (?:
        [?#]
        [^\\(\\)\\[\\]\\{\\}<>\\'\\\"\\x00-\\x20\\x7F-\\xFF]+
    )?
) | (?:
    (?:
        (?: (?: [a-zA-Z0-9-]{2,} \\. )+
            (?: arpa | com | org | net | edu | gov | mil | int | [a-z]{2}
                | aero | biz | coop | info | museum | name | pro
                | example | invalid | localhost | test | local | onion | swift ) )
        | (?: [0-9]{1,3} \\. [0-9]{1,3} \\. [0-9]{1,3} \\. [0-9]{1,3} )
    )
    (?: : [0-9]+ )?
    (?! [a-zA-Z0-9.:-] )
    (?:
        \\/
        [^&?#\\(\\)\\[\\]\\{\\}<>\\'\\\"\\x00-\\x20\\x7F-\\xFF]*
    )?
    (?:
        [?#]
        [^\\(\\)\\[\\]\\{\\}<>\\'\\\"\\x00-\\x20\\x7F-\\xFF]+
    )?
) | (?:
    [a-zA-Z0-9._-]{2,} @
    (?:
        (?: (?: [a-zA-Z0-9-]{2,} \\. )+
            (?: arpa | com | org | net | edu | gov | mil | int | [a-z]{2}
                | aero | biz | coop | info | museum | name | pro
                | example | invalid | localhost | test | local | onion | swift ) )
        | (?: [0-9]{1,3} \\. [0-9]{1,3} \\. [0-9]{1,3} \\. [0-9]{1,3} )
    )
) )/Dx", '', $text);

return (empty($exception_url))? $text : str_replace($placeholder_array, $exception_url, $text);

}

感谢 Mihai Loga 并设计了这个 RegEx……一切都始于一个好主意。

于 2012-08-26T18:59:06.433 回答