我目前在检测网址并使其可点击时遇到一些问题。 到目前为止,它总是运行良好,可能是因为我们总是用真实的网址对其进行测试,但现在网站已经存在,我们遇到了一些问题。
这是我们在
之前用来检测它们的代码$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);
它对普通网址做得很好,但有些网址却出现了问题:
- hk.linkedin.com
- www.test.com
- test.com
另请注意,某些网址中没有http。
我对正则表达式真的不太好,所以如果有人可以帮我解决这个问题,我会非常感激。
答案 0 :(得分:0)
你究竟想要得到什么。在这个例子中,我可以看到对正则表达式的公然缺乏理解......但是,根据Google Code Search,我在几个代码中看到了这个确切的代码。但是那些是为了在文本中间找到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列表......但这完全取决于您的需要。如果您只需要处理链接,可以尝试使用这些正则表达式,但是......