make_clickable() WP 0.71

Конвертує не клікабельні посилання в тексті – http://посилання на клікабельні (в HTML посилання). Також перетворює на посилання текст, що починається з: www, ftp, email.

Конвертує рядки, що починаються з http:// , www , ftp , email у відповідний HTML код посилання.

Враховує варіанти, коли URI вже клікабельний у тексті та не замінює його повторно.

Не обробляє текст усередині тегів: <code> , <pre> , <script> , <style> .

Пропускає рядок, що повертається через PHP функцію trim() – видаляє пробіли на кінцях рядка. У мене якось виникли складнощі з цією особливістю. З версії 3.8. прогалини на кінцях не видаляються.

За замовчуванням WP застосовується до тексту коментаря:

add_filter( 'comment_text', 'make_clickable', 9);

1 раз – 0.000662 сек
(повільно) | 50000 разів – 6.64 сек
(швидко) |
PHP 7.1.11, WP 4.9.8

Хуків немає.

Повертає

Строку. Змінений текст із HTML посиланнями.

Використання

$text = make_clickable( $text );
$text
(рядок) (обов’язковий)
Текст, який потрібно фільтрувати.

Приклади

0

#1 Перетворимо посилання в тексті (УРЛ) на клікабельне HTML посилання:

<?php
$ret = "Якийсь текст http://example.com/page-108 і ще якийсь текст.";
echo make_clickable($ret);
 ?>

В результаті цього прикладу ми отримаємо:

Якийсь текст <a href="http://example.com/page-108" rel="nofollow">http://example.com/page-108</a> та інший текст.
0

#2 Зробимо посилання клікабельним та з таргетом

Доопрацюємо попередній код так, щоб посилання відкривалося в новій вкладці за допомогою функції
links_add_target() .

<?php
$content = "Якийсь текст http://example.com/page-108 і ще якийсь текст.";
echo links_add_target( make_clickable( $content );
 ?>

В результаті цього прикладу ми отримаємо:

Якийсь текст <a href="http://example.com/page-108" rel="nofollow" target="_blank">http://example.com/page-108</a> та ще який текст.

список змін

З версії 0.71Введено.

Код make_clickable() WP 6.0.2

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 paretheses.
				if ( 2101 < strlen( $chunk ) ) {
					$r.=$chunk; // Too big, no whitespace: bail.
				} else {
					$r .= make_clickable( $chunk );
				}
			}
		} else {
			$ret = "$piece"; // Pad with whitespace до simplify the regexes.

			$url_clickable = '~
				([s(<.,;:!?])) # 1: Leading whitespace, або punctuation.
				(# 2: URL.
					[w]{1,20}+:// Scheme and hier-part prefix.
					(?=S{1,2000}s) # Limit to URLs less than about 2000 characters long.
					[wx80-xff#%~/@[]*(+=&$-]*+ # Non-punctuation URL character.
					(?: # Unroll the Loop: Only allow puctuation URL character if followed by non-punctuation URL character.
						['.,;:!?)] # Punctuation URL character.
						[wx80-xff#%~/@[]*(+=&$-]++ # Non-punctuation URL character.
					)*
				)
				()?) # 3: Trailing closing parenthesis (for parethesis balancing post processing).
			~xS';
			// The regex is non-anchored pattern and does not ave single fixed starting character.
			// Tell PCRE до зупинки більше часу, щоб optimizing since, коли використовувалися на page load, його буде можливо бути використані кілька разів.

			$ret = preg_replace_callback( $url_clickable, '_make_url_clickable_cb', $ret);

			$ret = preg_replace_callback( '#([s>]))((www|ftp).[wx80-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 );
}

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *