我一直在做一个小项目,我发现自己处在一个需要php函数的位置,该函数可以链接数据中的URL,同时使我可以在不想链接的链接上设置一些例外。任何想法如何做到这一点?
我在GitHub上有一个开源项目:LinkifyURL,您可能要考虑一下。它具有一个功能:linkify()
从文本中提取URL并将其转换为链接。请注意,这不是一项微不足道的任务!
如果您确实不需要链接特定的域(即vimeo和youtube),则可以使用以下修改的PHP函数linkify_filtered
(以有效的测试脚本形式)来满足您的需要:
<?php // test.php 20110313_1200
function linkify_filtered($text) {
$url_pattern = '/# Rev:20100913_0900 github.com\/jmrware\/LinkifyURL
# Match http & ftp URL that is not already linkified.
# Alternative 1: URL delimited by (parentheses).
(\() # $1 "(" start delimiter.
((?:ht|f)tps?:\/\/[a-z0-9\-._~!$&\'()*+,;=:\/?#[\]@%]+) # $2: URL.
(\)) # $3: ")" end delimiter.
| # Alternative 2: URL delimited by [square brackets].
(\[) # $4: "[" start delimiter.
((?:ht|f)tps?:\/\/[a-z0-9\-._~!$&\'()*+,;=:\/?#[\]@%]+) # $5: URL.
(\]) # $6: "]" end delimiter.
| # Alternative 3: URL delimited by {curly braces}.
(\{) # $7: "{" start delimiter.
((?:ht|f)tps?:\/\/[a-z0-9\-._~!$&\'()*+,;=:\/?#[\]@%]+) # $8: URL.
(\}) # $9: "}" end delimiter.
| # Alternative 4: URL delimited by <angle brackets>.
(<|&(?:lt|\#60|\#x3c);) # $10: "<" start delimiter (or HTML entity).
((?:ht|f)tps?:\/\/[a-z0-9\-._~!$&\'()*+,;=:\/?#[\]@%]+) # $11: URL.
(>|&(?:gt|\#62|\#x3e);) # $12: ">" end delimiter (or HTML entity).
| # Alternative 5: URL not delimited by (), [], {} or <>.
( # $13: Prefix proving URL not already linked.
(?: ^ # Can be a beginning of line or string, or
| [^=\s\'"\]] # a non-"=", non-quote, non-"]", followed by
) \s*[\'"]? # optional whitespace and optional quote;
| [^=\s]\s+ # or... a non-equals sign followed by whitespace.
) # End $13. Non-prelinkified-proof prefix.
( \b # $14: Other non-delimited URL.
(?:ht|f)tps?:\/\/ # Required literal http, https, ftp or ftps prefix.
[a-z0-9\-._~!$\'()*+,;=:\/?#[\]@%]+ # All URI chars except "&" (normal*).
(?: # Either on a "&" or at the end of URI.
(?! # Allow a "&" char only if not start of an...
&(?:gt|\#0*62|\#x0*3e); # HTML ">" entity, or
| &(?:amp|apos|quot|\#0*3[49]|\#x0*2[27]); # a [&\'"] entity if
[.!&\',:?;]? # followed by optional punctuation then
(?:[^a-z0-9\-._~!$&\'()*+,;=:\/?#[\]@%]|$) # a non-URI char or EOS.
) & # If neg-assertion true, match "&" (special).
[a-z0-9\-._~!$\'()*+,;=:\/?#[\]@%]* # More non-& URI chars (normal*).
)* # Unroll-the-loop (special normal*)*.
[a-z0-9\-_~$()*+=\/#[\]@%] # Last char can\'t be [.!&\',;:?]
) # End $14. Other non-delimited URL.
/imx';
// $url_replace = '$1$4$7$10$13<a href="$2$5$8$11$14">$2$5$8$11$14</a>$3$6$9$12';
// return preg_replace($url_pattern, $url_replace, $text);
$url_replace = '_linkify_filter_callback';
return preg_replace_callback($url_pattern, $url_replace, $text);
}
function _linkify_filter_callback($m)
{ // Filter out youtube and vimeo domains.
$pre = $m[1].$m[4].$m[7].$m[10].$m[13];
$url = $m[2].$m[5].$m[8].$m[11].$m[14];
$post = $m[3].$m[6].$m[9].$m[12];
if (preg_match('/\b(?:youtube|vimeo)\.com\b/', $url)) {
return $pre . $url . $post;
} // else linkify...
return $pre .'<a href="'. $url .'">' . $url .'</a>' .$post;
}
// Create some test data.
$data = 'Plain URLs (not delimited):
foo http://example.com bar...
foo http://example.com:80 bar...
foo http://example.com:80/path/ bar...
foo http://example.com:80/path/file.txt bar...
foo http://example.com:80/path/file.txt?query=val&var2=val2 bar...
foo http://example.com:80/path/file.txt?query=val&var2=val2#fragment bar...
foo http://example.com/(file\'s_name.txt) bar... (with \' and (parentheses))
foo http://[2001:0db8:85a3:08d3:1319:8a2e:0370:7348] bar... ([IPv6 literal])
foo http://[2001:0db8:85a3:08d3:1319:8a2e:0370:7348]/file.txt bar... ([IPv6] with path)
foo http://youtube.com bar...
foo http://youtube.com:80 bar...
foo http://youtube.com:80/path/ bar...
foo http://youtube.com:80/path/file.txt bar...
foo http://youtube.com:80/path/file.txt?query=val&var2=val2 bar...
foo http://youtube.com:80/path/file.txt?query=val&var2=val2#fragment bar...
foo http://youtube.com/(file\'s_name.txt) bar... (with \' and (parentheses))
foo http://vimeo.com bar...
foo http://vimeo.com:80 bar...
foo http://vimeo.com:80/path/ bar...
foo http://vimeo.com:80/path/file.txt bar...
foo http://vimeo.com:80/path/file.txt?query=val&var2=val2 bar...
foo http://vimeo.com:80/path/file.txt?query=val&var2=val2#fragment bar...
foo http://vimeo.com/(file\'s_name.txt) bar... (with \' and (parentheses))
';
// Verify it works...
echo(linkify_filtered($data) ."\n");
?>
这采用了回调函数来进行过滤。是的,正则表达式很复杂(但事实证明是个问题!)。您可以linkify()
在此处查看交互式Java语言版本的实际操作:URLLinkification(HTTP /FTP)。
另外,JohnGruber有一个很好的正则表达式来进行链接化。请参阅:改进的自由,准确的正则表达式模式,用于匹配URL。但是,他的正则表达式在某些情况下会遭受_灾难性的回溯_ 。(有关此事,我已经写信给他,但他尚未回复。)
希望这可以帮助!:)
问题内容: 我有一个-link元素,该元素具有指向页面的href链接,但是我必须使用Ajax从href -url加载该内容,而不是将用户重定向到该页面。如何修改链接以仅从该链接加载内容,以便可以将该内容注入当前页面? 我做了这个,但是没用。 问题答案: 的负载功能并不旨在收集请求响应,该功能用于负载HTML从远程文件并注入到一个DOM元素,例如: 如果处理锚元素的单击事件,则应防止浏览器跟随链接h
问题内容: 我正在使用Selenium 2 Java API与网页进行交互。我的问题是:如何检测链接目标的内容类型? 基本上,这是背景:单击链接之前,我想确保响应是HTML文件。如果没有,我需要以其他方式处理它。因此,假设有一个PDF文件的下载链接。应用程序应直接读取该URL的内容,而不是在浏览器中打开它。 我们的目标是拥有一个能够自动知道当前位置是HTML,PDF,XML或其他类型的应用程序,以
本文向大家介绍用ajax实现预览链接可以看到链接的内容,包括了用ajax实现预览链接可以看到链接的内容的使用技巧和注意事项,需要的朋友参考一下 首先先看实现代码 html代码部分 这个CSS设置预览弹出窗口的样式 这个JavaScript进行服务器请求并且显示弹出窗口 分析: 1. 这是initAll()函数的内容,它遍历页面上的所有链接,并且在每个链接上添加onmouseover事件 处理程序。
问题内容: 我正在使用Selenium 2 Java API与网页进行交互。我的问题是:如何检测链接目标的内容类型? 基本上,这是背景:单击链接之前,我想确保响应是HTML文件。如果没有,我需要以其他方式处理它。因此,假设有一个PDF文件的下载链接。应用程序应直接读取该URL的内容,而不是在浏览器中打开它。 目标是拥有一个能够自动知道当前位置为HTML,PDF,XML或任何其他类型的应用程序,以使
问题内容: 我正在使用Selenium 2 Java API与网页进行交互。我的问题是: 如何检测链接目标的内容类型? 基本上,这是背景:在单击链接之前,我想确保 响应是HTML文件。如果没有,我需要以其他方式处理它。 因此,假设有一个PDF文件的下载链接。应用程序应 直接读取该URL的内容,而不是在浏览器中打开它。 我们的目标是拥有一个能够自动知道 当前位置是HTML,PDF,XML或其他类型的
我有一个智能组件,它调用一个从api检索所有信息的服务,并加载一组显示所有信息的哑组件。 当初始化时,智能组件从url中获取id,并将其发送给服务,以从api中获取所有数据,并且一切都按照预期工作,但是当我单击页面上的链接之一,该链接应该加载相同的页面但不同的id,url改变了,但不改变视图,并且我在控制台上也没有看到任何activity。 这是智能组件: 这是显示链接的哑组件: 这是从“第一个”