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