make_clickable()
云策文档标注
概述
make_clickable() 函数用于将纯文本中的 URI、www、ftp 和电子邮件地址转换为可点击的 HTML 链接,并处理链接嵌套问题。
关键要点
- 函数接受一个字符串参数 $text,返回转换后的字符串。
- 支持转换 URI、www、ftp 和电子邮件地址,适用于长字符串处理。
- 内部使用正则表达式分割 HTML 标签,避免在
或标签内转换链接。
- 包含清理机制,防止链接内嵌套链接。
代码示例
$string = "This is a long text that contains some links like http://www.wordpress.org and http://www.wordpress.com .";
echo make_clickable( $string );
原文内容
Converts plaintext URI to HTML links.
Description
Converts URI, www and ftp, and email addresses. Finishes by fixing links within links.
Parameters
$textstringrequired-
Content to convert URIs.
Source
function make_clickable( $text ) {
$r = '';
$textarr = preg_split( '/(<[^<>]+>)/', $text, -1, PREG_SPLIT_DELIM_CAPTURE ); // Split out HTML tags.
$nested_code_pre = 0; // Keep track of how many levels link is nested inside <pre> or <code>.
foreach ( $textarr as $piece ) {
if ( preg_match( '|^<code[s>]|i', $piece )
|| preg_match( '|^<pre[s>]|i', $piece )
|| preg_match( '|^<script[s>]|i', $piece )
|| preg_match( '|^<style[s>]|i', $piece )
) {
++$nested_code_pre;
} elseif ( $nested_code_pre
&& ( '</code>' === strtolower( $piece )
|| '</pre>' === strtolower( $piece )
|| '</script>' === strtolower( $piece )
|| '</style>' === strtolower( $piece )
)
) {
--$nested_code_pre;
}
if ( $nested_code_pre
|| empty( $piece )
|| ( '<' === $piece[0] && ! preg_match( '|^<s*[w]{1,20}+://|', $piece ) )
) {
$r .= $piece;
continue;
}
// Long strings might contain expensive edge cases...
if ( 10000 < strlen( $piece ) ) {
// ...break it up.
foreach ( _split_str_by_whitespace( $piece, 2100 ) as $chunk ) { // 2100: Extra room for scheme and leading and trailing parentheses.
if ( 2101 < strlen( $chunk ) ) {
$r .= $chunk; // Too big, no whitespace: bail.
} else {
$r .= make_clickable( $chunk );
}
}
} else {
$ret = " $piece "; // Pad with whitespace to simplify the regexes.
$url_clickable = '~
([\s(<.,;:!?]) # 1: Leading whitespace, or punctuation.
( # 2: URL.
[\w]{1,20}+:// # Scheme and hier-part prefix.
(?=S{1,2000}s) # Limit to URLs less than about 2000 characters long.
[\w\x80-\xff#%\~/@\[\]*(+=&$-]*+ # Non-punctuation URL character.
(?: # Unroll the Loop: Only allow punctuation URL character if followed by a non-punctuation URL character.
['.,;:!?)] # Punctuation URL character.
[\w\x80-\xff#%\~/@\[\]*(+=&$-]++ # Non-punctuation URL character.
)*
)
()?) # 3: Trailing closing parenthesis (for parenthesis balancing post processing).
(\.\w{2,6})? # 4: Allowing file extensions (e.g., .jpg, .png).
~xS';
/*
* The regex is a non-anchored pattern and does not have a single fixed starting character.
* Tell PCRE to spend more time optimizing since, when used on a page load, it will probably be used several times.
*/
$ret = preg_replace_callback( $url_clickable, '_make_url_clickable_cb', $ret );
$ret = preg_replace_callback( '#([s>])((www|ftp).[w\x80-\xff#$%&~/.-;:=,?@[]+]+)#is', '_make_web_ftp_clickable_cb', $ret );
$ret = preg_replace_callback( '#([s>])([.0-9a-z_+-]+)@(([0-9a-z-]+.)+[0-9a-z]{2,})#i', '_make_email_clickable_cb', $ret );
$ret = substr( $ret, 1, -1 ); // Remove our whitespace padding.
$r .= $ret;
}
}
// Cleanup of accidental links within links.
return preg_replace( '#(<a([ rnt]+[^>]+?>|>))<a [^>]+?>([^>]+?)</a></a>#i', '$1$3</a>', $r );
}
Changelog
| Version | Description |
|---|---|
| 0.71 | Introduced. |
Skip to note 3 content
Nicola Mustone
This example shows how to use
make_clickablewith a string of text to turn any URLs within into links.To find out more about this function, visit this link: <a href="https://developer.wordpress.org/reference/functions/make_clickable/</p>" rel="ugc">https://developer.wordpress.org/reference/functions/make_clickable/</p><>;' ); ?>The result will be:
<p>To find out more about this function, visit this link: <a href="<a href="https://developer.wordpress.org/reference/functions/make_clickable/"" rel="ugc">https://developer.wordpress.org/reference/functions/make_clickable/"</a>; rel="nofollow"><a href="https://developer.wordpress.org/reference/functions/make_clickable/</a></p>" rel="ugc">https://developer.wordpress.org/reference/functions/make_clickable/</a></p><>;Skip to note 4 content
Codex
Display all URLs in clickable links
$string = "This is a long text that contains some links like <a href="http://www.wordpress.org" rel="nofollow ugc">http://www.wordpress.org</a> and <a href="http://www.wordpress.com" rel="nofollow ugc">http://www.wordpress.com</a> ."; echo make_clickable( $string );