1

我有一个自定义编辑用户界面,允许用户输入他们自己的 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);
4

2 回答 2

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
);
于 2012-11-04T11:03:29.417 回答
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;
}

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

在文本块中使链接可点击的最佳方法

使用正则表达式使链接可点击

和 ...

于 2012-11-04T11:05:55.670 回答