URL检测问题


URL detection problems

我目前在检测url并使它们可点击方面遇到了一些问题。到目前为止,它一直工作得很好,可能是因为我们总是用真实的url进行测试,但现在网站是实时的,我们有一些问题。

这是我们在

之前用来检测它们的代码
$content = preg_replace('!(((f|ht)tp://)[-a-zA-Zа-яА-Я()0-9@:%_+.~#?&;//=]+)!i', '<a href="$1" target="_blank">$1</a>', $content);
$content = eregi_replace('([[:space:]()[{}])(www.[-a-zA-Z0-9@:%_'+.~#?&//=]+)', '''1<a href="''2" target="_blank">''2</a>', $content);

对于正常的url,它做得很好,但是有些url会出现问题:

- hk.linkedin.com
- www.test.com
- test.com

还需要注意的是,有些url中没有http。

我真的不太擅长正则表达式,所以如果有人能帮我解决这个问题,我将非常感激。

你到底想要什么?在这个例子中,我可以看到明显缺乏对正则表达式的理解…但是,根据谷歌代码搜索,我在一些代码中看到了相同的代码。但是那些是用来在文本中间查找URL的(并不总是看起来像URL的URL,但如果它包含http://www,则肯定是URL)。

不是所有的事情都只需要使用正则表达式。这些都是有用的,但有时也会带来额外的问题。

正则表达式的一个问题是它们对结果没有条件。您可以使用多个正则表达式,但有可能会做错一些事情(比如影响之前的正则表达式所做的事情)。看看这个。它分配了额外的函数(你可以使用e修饰符,但它可能使代码不可读)。

<?php
$content = preg_replace_callback('{'b(?:(https?|ftp)://)?('S+[.]'S+)'b}i',
                                 'addHTTP', $content);
function addHTTP($matches) {
    if(empty($matches[1])) {
        return '<a href="http://' . $matches[2] . '">http://' . $matches[2] . '</a>';
    }
    else {
        return '<a href="' . $matches[2] . '">' . $matches[2] . '</a>';
    }
}

或者两个正则表达式(更难理解)…

$content = preg_replace('{'b(?:(?:https?|ftp)://)'S+[.]'S+'b}i',
                        '<a href="$0">$0</a>', $content);
$content = preg_replace('{'b(?<!["''=><.])[-a-zA-Zа-яА-Яа-яА-Я()0-9@:%_+.~#?&;//=]+[.][-a-zA-Zа-яА-Яа-яА-Я()0-9@:%_+.~#?&;//=]+(?!["''=><.])'b}i',
                        '<a href="http://$0">http://$0</a>', $content);

同样,您应该避免使用target=""。用户不希望在点击链接时出现新窗口。当用户点击这样的链接后,他可能想知道为什么"向左走"按钮不起作用(提示:新窗口导致它消失)。如果有人真的想在新窗口打开链接,他会自己做(这并不难…)。

请注意,通常这样的东西是与其他帮助链接在一起的。例如,Stack Overflow使用了某种Markdown修改,它可以进行更智能的重命名,比如将纯文本列表更改为HTML列表……但这完全取决于你需要什么。如果您只需要处理链接,您可以尝试使用这些regexp,但是