如何使用REGEX保留链接中的单引号和双引号?

时间:2015-12-21 11:50:38

标签: php html regex

我有一个正则表达式代码,可以找到所有网址并用HTML链接替换它们。这是我的代码:

// initializing
$str = "this is a good website www.example.com/classname/methodname/arg";

$rexProtocol = '(https?://)?';
$rexDomain   = '((?:[-a-zA-Z0-9]{1,63}\.)+[-a-zA-Z0-9]{2,63}|(?:[0-9]{1,3}\.){3}[0-9]{1,3})';
$rexPort     = '(:[0-9]{1,5})?';
$rexPath     = '(/[!$-/0-9:;=@_\':;!a-zA-Z\x7f-\xff]*?)?';
$rexQuery    = '(\?[!$-/0-9:;=@_\':;!a-zA-Z\x7f-\xff]+?)?';
$rexFragment = '(#[!$-/0-9:;=@_\':;!a-zA-Z\x7f-\xff]+?)?';

function callback($match){
    // Prepend http:// if no protocol specified
    $completeUrl = $match[1] ? $match[0] : "http://{$match[0]}";
    $DetectProperName = strlen($match[2].$match[3].$match[4]) > 20 ? "...".substr($match[2].$match[3].$match[4],0,20) : $match[2].$match[3].$match[4];
    return '<a href="' . $completeUrl . '" target="_blank">'.$DetectProperName. '</a>';
}

echo $str =  preg_replace_callback("&\\b$rexProtocol$rexDomain$rexPort$rexPath$rexQuery$rexFragment(?=[?.!,;:\"]?(\s|$))&",'callback', htmlspecialchars($str));

此处还有输出:

this is a good website <a href="http://www.example.com/classname/methodname/arg" target="_blank">...www.example.com/clas</a>

此处还有fiddle

嗯,这没关系,它也适用于链接。现在我的问题是输入何时包含引用'"。该正则表达式将在其旁边添加\。我该如何解决?我希望这样的正则表达式对引号不敏感。

以下是一个例子:

输入:

$str = 'this is a " (quote)';

当前输出:

this is a \" (quote)

我想要的是什么:

this is a " (quote)

我该怎么做?

编辑:根据一些测试,我发现将单/双引号更改为ASKII代码。我该如何预防?

0 个答案:

没有答案