函数文档

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.

Return

string Content with converted URIs.

More Information

This function can be fed long strings with URIs and email links and will convert them into clickable links. You are not limited to feeding it just the link text itself (see the long string in the example above).

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.

User Contributed Notes

  1. Skip to note 3 content

    This example shows how to use make_clickable with 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&gt" rel="ugc">https://developer.wordpress.org/reference/functions/make_clickable/</p&gt<>;' ); ?>

    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/&quot" 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&gt" rel="ugc">https://developer.wordpress.org/reference/functions/make_clickable/</a></p&gt<>;

  2. Skip to note 4 content

    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 );