PHP:使用<;a>;标记、省略号和链接图标
当用户输入URL时,例如PHP:使用<;a>;标记、省略号和链接图标,php,url,prettify,Php,Url,Prettify,当用户输入URL时,例如http://www.google.com,我希望能够使用PHP分析该文本,找到任何链接,,并将其替换为 我希望能够对这些表单的所有URL执行此操作(使用与任何TLD可互换的.com): 最有效的方法是什么?我可以试着写一些非常花哨的正则表达式,但我怀疑这是我能用的最好的方法 为了获得额外的积分,我还想预先添加http://到任何缺少它的URL,并将显示文本本身剥离为http://www.google.com/reallyLongL...并在之后显示一个外部链接图标。不太
http://www.google.com
,我希望能够使用PHP分析该文本,找到任何链接,,并将其替换为
我希望能够对这些表单的所有URL执行此操作(使用与任何TLD可互换的.com
):
最有效的方法是什么?我可以试着写一些非常花哨的正则表达式,但我怀疑这是我能用的最好的方法
为了获得额外的积分,我还想预先添加
http://
到任何缺少它的URL,并将显示文本本身剥离为http://www.google.com/reallyLongL...
并在之后显示一个外部链接图标。不太花哨的regexp应该可以工作
/\b(https?:\/\/[^\s+\"\<\>]+)/ig
/\b(www.[^\s+\"\<\>]+)/ig
不那么花哨的正则表达式应该可以工作
/\b(https?:\/\/[^\s+\"\<\>]+)/ig
/\b(www.[^\s+\"\<\>]+)/ig
试图找到domain.com格式的链接将是一件痛苦的事。这将需要跟踪所有TLD并在搜索中使用它们。如果你不知道我键入的最后一句话的结尾,那么这句话的开头将是指向的链接。即使你这样做了。in是一个有效的TLD和一个常用词
我建议您告诉您的用户,他们必须从
www.
或http://
开始链接,然后编写一个简单的正则表达式来捕获它们并添加链接。尝试在domain.com格式中查找链接将是一件痛苦的事。这将需要跟踪所有TLD并在搜索中使用它们。如果你不知道我键入的最后一句话的结尾,那么这句话的开头将是指向的链接。即使你这样做了。in是一个有效的TLD和一个常用词
我建议告诉您的用户,他们必须从
www.
或http://
开始链接,然后编写一个简单的正则表达式来捕获它们并添加链接。我完全按照我希望的方式完成了此操作:
<?php
$input = <<<EOF
http://www.example.com/
http://example.com
www.example.com
http://iamanextremely.com/long/link/so/I/will/be/trimmed/down/a/bit/so/i/dont/mess
/up/text/wrapping.html
EOF;
function trimlong($match)
{
$url = $match[0];
$display = $url;
if ( strlen($display) > 30 ) {
$display = substr($display,0,30)."...";
}
return '<a href="'.$url.'">'.$display.' <img src="http://static.goalscdn.com/img/external-link.gif" height="10" width="11" /></a>';
}
$output = preg_replace_callback('#(http://|www\\.)[^\\s<]+[^\\s<,.]#i',
array($this,'trimlong'),$input);
echo $output;
我在这里完全按照我想要的方式工作:
<?php
$input = <<<EOF
http://www.example.com/
http://example.com
www.example.com
http://iamanextremely.com/long/link/so/I/will/be/trimmed/down/a/bit/so/i/dont/mess
/up/text/wrapping.html
EOF;
function trimlong($match)
{
$url = $match[0];
$display = $url;
if ( strlen($display) > 30 ) {
$display = substr($display,0,30)."...";
}
return '<a href="'.$url.'">'.$display.' <img src="http://static.goalscdn.com/img/external-link.gif" height="10" width="11" /></a>';
}
$output = preg_replace_callback('#(http://|www\\.)[^\\s<]+[^\\s<,.]#i',
array($this,'trimlong'),$input);
echo $output;
www.google.com
这不是URL,而是主机名。在任意文本中标记裸主机名通常不是一个好主意,因为在一般情况下,任何单词或点分隔单词序列都是完全有效的主机名。这意味着你会遇到可怕的黑客攻击,比如寻找领先的www.
(你会遇到这样的问题:“为什么我可以链接到www.stackoverflow.com
,但不能链接到stackoverflow.com
?”)或者跟踪TLD(随着越来越多的新TLD的引入,这变得越来越不切实际;“为什么我喜欢ncm.com而不喜欢ncm.museum
?”,而且你经常会标记不应该是链接的东西
我可以试着写一些非常花哨的正则表达式
我看不出没有正则表达式你会怎么做
诀窍在于处理标记。如果您可以使用
www.google.com
这不是一个URL,而是一个主机名。在任意文本中标记裸主机名通常不是一个好主意,因为在一般情况下,任何单词或点分隔单词序列都是完全有效的主机名。这意味着你会遇到可怕的黑客,比如查找领先的www.
(你会遇到如下问题“为什么我可以链接到www.stackoverflow.com
但不能链接到stackoverflow.com
?”)或后续TLD(随着越来越多的新TLD的引入,这变得越来越不切实际;“为什么我可以链接到ncm.com而不能链接到ncm.museum
?”),而且你经常会标记不应该链接的东西
我可以试着写一些非常花哨的正则表达式
我看不出没有正则表达式你会怎么做
诀窍在于处理标记
函数标记\u URL($text)
{
//把课文分成几个字
$words=preg_split(“/([\s\n\r]+)/”,$text,-1,preg_split_DELIM_CAPTURE);
$text=”“;
//反复读单词
foreach($words作为$word){
//chopword=将被替换的单词部分
$chopword=$word;
$chopword=preg_replace('/^[^A-Za-z0-9]*/',''.$chopword);
如果($chopword“”){
//linkword=将在单词中替换chopword的文本
$linkword='';
//是从什么开始的http://abc. ?
if(preg_match('/^(http:\/\/)[a-zA-Z0-9\]{2,}.*/',$chopword)){
$chopword=preg_replace('/[^A-Za-z0-9\/]*$/',''$chopword);
$linkword='';
//它是否等于abc.def.ghi?
}else if(preg_match('/^[a-zA-Z]{2,}.([a-zA-Z0-9\+\)+[a-zA-Z]{2,}(\/.*)/',$chopword)){
$chopword=preg_replace('/[^A-Za-z0-9\/]*$/',''$chopword);
$linkword='';
//是从什么开始的abc@def.ghi ?
}else if(预匹配('/^[a-zA-Z0-9\.]+\@([a-zA-Z0-9\.]{2,}\.+[a-zA-Z]{2,}.*/',$chopword)){
$chopword=preg_replace('/[^A-Za-z0-9]*$/',''$chopword);
$linkword='';
}
//用word中的链接词替换chopword(如果设置了链接词)
如果($linkword“”){
$word=str\u replace($chopword,$linkword,$word);
}
}
//附加这个词
$text=$text.$word;
}
返回$text;
}
来自
函数标记\u URL($text)
{
//把课文分成几个字
$words=preg_split(“/([\s\n\r]+)/”,$text,-1,preg_split_DELIM_CAPTURE);
$text=”“;
//反复读单词
foreach($words作为$word){
//chopword=将被替换的单词部分
$chopword=$word;
$chopword=preg_replace('/^[^A-Za-z0-9]*/',''.$chopword);
如果($chopword“”){
//linkword=将在单词中替换chopword的文本
$linkword='';
//是从什么开始的http://abc. ?
if(preg_match('/^(http:\/\/)[a-zA-Z0-9\]{2,}.*/',$chopword)){
$chopword=preg_replace('/[^A-Za-z0-9\/]*$/',''$chopword);
$linkword='';
//它是否等于abc.def.ghi?
}如果有其他情况(预处理)
function markup_urls ($text)
{
// split the text into words
$words = preg_split('/([\s\n\r]+)/', $text, -1, PREG_SPLIT_DELIM_CAPTURE);
$text = "";
// iterate through the words
foreach($words as $word) {
// chopword = the portion of the word that will be replaced
$chopword = $word;
$chopword = preg_replace('/^[^A-Za-z0-9]*/', '', $chopword);
if ($chopword <> '') {
// linkword = the text that will replace chopword in the word
$linkword='';
// does it start with http://abc. ?
if (preg_match('/^(http:\/\/)[a-zA-Z0-9_]{2,}.*/', $chopword)) {
$chopword = preg_replace('/[^A-Za-z0-9\/]*$/', '', $chopword);
$linkword = '<a href="'.$chopword.'" target="blank">'.$chopword.'</a>';
// does it equal abc.def.ghi ?
} else if (preg_match('/^[a-zA-Z]{2,}\.([a-zA-Z0-9_]+\.)+[a-zA-Z]{2,}(\/.*)?/', $chopword)) {
$chopword = preg_replace('/[^A-Za-z0-9\/]*$/', '', $chopword);
$linkword = '<a href="http://'.$chopword.'" target="blank">'.$chopword.'</a>';
// does it start with abc@def.ghi ?
} else if (preg_match('/^[a-zA-Z0-9_\.]+\@([a-zA-Z0-9_]{2,}\.)+[a-zA-Z]{2,}.*/', $chopword)) {
$chopword = preg_replace('/[^A-Za-z0-9]*$/', '', $chopword);
$linkword = '<a href="mailto:'.$chopword.'">'.$chopword.'</a>';
}
// replace chopword with linkword in word (if linkword was set)
if ($linkword <> '') {
$word = str_replace($chopword, $linkword, $word);
}
}
// append the word
$text = $text.$word;
}
return $text;
}