我有一个正则表达式代码,可以找到所有网址并用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代码。我该如何预防?