PHP Regex使URL可点击链接并从自定义输入中提取链接标题

时间:2012-11-04 10:10:35

标签: php regex url hyperlink

我有一个自定义编辑用户界面,我允许用户输入自己的URL,到目前为止,我有正则表达式来查找URL并将它们全部转换为可点击的html链接。但我也想让用户选择输入他们自己的链接标题,类似于StackOverflow上的格式:

[链接名称](http://www.yourlink.com/)

如何更改下面的代码以从括号中提取标题,从括号中提取URL,并将常规URL转换为可点击链接(即使他们只输入http://www.yourlink.com/没有标题)?

$text = preg_replace('/(((f|ht){1}tp:\/\/)[-a-zA-Z0-9@:%_\+.~#?&\/\/=]+)/i',
                       '<a href="\\1" target="_blank">\\1</a>', $text);
$text = preg_replace('/([[:space:]()[{}])(www.[-a-zA-Z0-9@:%_\+.~#?&\/\/=]+)/i',
                       '\\1<a href="http://\\2" target="_blank">\\2</a>', $text);
$text = preg_replace('/([_\.0-9a-z-]+@([0-9a-z][0-9a-z-]+\.)+[a-z]{2,3})/i',
                       '<a href="mailto:\\1">\\1</a>', $text);

2 个答案:

答案 0 :(得分:4)

首先,您必须使用描述处理这些链接,如下所示:

$text = preg_replace(
    '/\[([^\]]+)\]\((((f|ht){1}tp:\/\/)[-a-zA-Z0-9@:%_\+.~#?&\/\/=]+)\)/i',
    '<a href="\\2" target="_blank">\\1</a>', 
    $text
);

但是现在,放置在href中的常规URL将在常规链接的下一次替换迭代中匹配,因此我们需要对其进行修改以将其排除,例如仅当匹配前面没有"时才匹配:

$text = preg_replace(
    '/(^|[^"])(((f|ht){1}tp:\/\/)[-a-zA-Z0-9@:%_\+.~#?&\/\/=]+)/i',
    '\\1<a href="\\2" target="_blank">\\2</a>', 
    $text
);

答案 1 :(得分:1)

试试这个:

<?php
$text = "hello http://example.com sample
[Name of Link](http://www.yourlink.com/)
[Name of a](http://www.world.com/)
[Name of Link](http://www.hello.com/)
<a href=\"http://stackoverflow.com\">hello world</a>
<a href='http://php.net'>php</a>
";
echo nl2br(make_clickable($text));
function make_clickable($text) {
   $text = preg_replace_callback(
    '#\[(.+)\]\((\bhttps?://[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|)/))\)#', 
    create_function(
      '$matches',
      'return "<a href=\'{$matches[2]}\'>{$matches[1]}</a>";'
    ),
    $text
  );
  $text = preg_replace_callback('#(?<!href\=[\'"])(https?|ftp|file)://[-A-Za-z0-9+&@\#/%()?=~_|$!:,.;]*[-A-Za-z0-9+&@\#/%()=~_|$]#', create_function(
      '$matches',
      'return "<a href=\'{$matches[0]}\'>{$matches[0]}</a>";'
    ), $text);
  return $text;
}

基于以下链接编写(编辑):

Best way to make links clickable in block of text

Make links clickable with regex

和......