PHP:使用<;a>;标记、省略号和链接图标

PHP:使用<;a>;标记、省略号和链接图标,php,url,prettify,Php,Url,Prettify,当用户输入URL时,例如http://www.google.com,我希望能够使用PHP分析该文本,找到任何链接,,并将其替换为 我希望能够对这些表单的所有URL执行此操作(使用与任何TLD可互换的.com): 最有效的方法是什么?我可以试着写一些非常花哨的正则表达式,但我怀疑这是我能用的最好的方法 为了获得额外的积分,我还想预先添加http://到任何缺少它的URL,并将显示文本本身剥离为http://www.google.com/reallyLongL...并在之后显示一个外部链接图标。不太

当用户输入URL时,例如
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;
}