wptexturize() WP 0.71

Змінює деякі символи в тексті більш правильні, читані і візуально привабливі.

Текст змінюється так:

"текст у лапках" стане "текстом у лапках" “текстом у лапках”
'текст у лапках' стане 'текстом у лапках' ‘текст в лапках’
	   president's стане president's president’s
	   presidents' стане presidents' presidents’
			   --- стане - & # 8212;
				- стане - & # 8212;
				- стане - & # 8211;
			   ... стане … & # 8230;
			  (tm) стане ™ ™
				'' стане ” ”
				`` стане ““
			   12' стане 12′ 12′
			   12" стане 12" 12″
			   '99 стане '99 ’99
			 22x44 стане 22×44 22×44

Деякі символи залежать від поточної мови сайту (від локалізації), наприклад, лапки.

Також існує перелік спеціальних фраз для перетворення. Цей список можна змінити визначивши константу $wp_cockneyreplace , в якій вказати асоціативний масив з ключами, що містять вихідні рядки, і значеннями, що містять перетворені рядки. За замовчуванням такий список фраз:

'tain't
'twere
'twas
'tis
'twill
'til
'bout
'nuff
'round
'cause

Текст усередині HTML блоків <pre>, <code>, <kbd>, <style>, <script>, <tt>та в шоткоді codeпропускається:

Якщо потрібно вказати html теги чи шоткод винятки, тобто. такі, де функція працювати не буде, використовуйте фільтри no_texturize_shortcodes відповідно.

Список всіх фільтрів, до яких за замовчуванням застосовується функція:

add_filter( 'comment_author', 'wptexturize');
add_filter( 'term_name', 'wptexturize');
add_filter('link_name', 'wptexturize');
add_filter('link_description', 'wptexturize');
add_filter( 'link_notes', 'wptexturize');
add_filter( 'bloginfo', 'wptexturize' );
add_filter( 'wp_title', 'wptexturize');
add_filter( 'widget_title', 'wptexturize');

add_filter( 'single_post_title', 'wptexturize');
add_filter( 'single_cat_title', 'wptexturize');
add_filter( 'single_tag_title', 'wptexturize');
add_filter( 'single_month_title', 'wptexturize');
add_filter( 'nav_menu_attr_title', 'wptexturize');
add_filter( 'nav_menu_description', 'wptexturize');

add_filter( 'term_description', 'wptexturize');
add_filter( 'get_the_post_type_description', 'wptexturize');

add_filter( 'the_title', 'wptexturize');
add_filter( 'the_content', 'wptexturize');
add_filter( 'the_excerpt', 'wptexturize');
add_filter( 'the_post_thumbnail_caption', 'wptexturize');
add_filter( 'comment_text', 'wptexturize' );
add_filter('list_cats', 'wptexturize');
add_filter( 'widget_text_content', 'wptexturize');
add_filter( 'the_excerpt_embed', 'wptexturize');

Функцію рекомендується використовувати після події init , інакше вона працюватиме неправильно!

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

Повертає

Строку. Відформатований текст.

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

$text = wptexturize( $text, $reset );
$text
(рядок) (обов’язковий)
Текст, який потрібно відформатувати.
$reset
(true/false)
Встановіть у true для unit тестів. Перекладені шаблони будуть скинуті.


Default: false

Приклади

0

#1 Базове використання

Замінимо символи у рядку:

$text = "'---' "--" 1234" 1234' (tm) ... 1234x1234";
$new_text = wptexturize($text);
echo $new_text;

// Отримаємо:
// на екран: '—' “–” 1234″ 1234′ ™ … 1234×1234
// у коді: ‘—’ “–” 1234″ 1234′ & # 8482; & # 8230; 1234×1234
0

#2 Як вимкнути форматування тексту через wptexturize

Якщо ви помітили, що контент посту обробляється функцією wptexturize() , то її можна відключити відмінивши фільтр, щоб він не працював для контенту, що виводиться. Використовуємо для цього функцію remove_filter() :

remove_filter( 'the_content', 'wptexturize'); // у записах
remove_filter( 'the_excerpt', 'wptexturize'); // в анонсі
remove_filter( 'comment_text', 'wptexturize' ); // у коментарях
remove_filter( 'the_title', 'wptexturize'); // у заголовках

Інші фільтри, які також використовують форматування і які можна відключити, дивіться вище у списку.

нотатки

  • Global. Масив. $wp_cockneyreplace Array of formatted entities for certain common phrases.
  • Global. Масив. $shortcode_tags

список змін

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

Код wptexturize() WP 6.0.2

function wptexturize( $text, $reset = false ) {
	Global $wp_cockneyreplace, $shortcode_tags;
	static $static_characters = null,
		$static_replacements = null,
		$dynamic_characters = null,
		$dynamic_replacements = null,
		$default_no_texturize_tags = null,
		$default_no_texturize_shortcodes = null,
		$run_texturize = true,
		$apos = null,
		$prime = null,
		$ double_prime = null,
		$opening_quote = null,
		$closing_quote = null,
		$opening_single_quote = null,
		$closing_single_quote = null,
		$open_q_flag = '<!--oq-->',
		$open_sq_flag = '<!--osq-->',
		$apos_flag = '<!--apos-->';

	// If there's nothing to do, just stop.
	if ( empty( $text ) || false === $run_texturize ) {
		return $text;
	}

	// Set up static variables. Run once only.
	if ( $reset | | ! isset ( $ static_characters ) ) {
		/**
		 * Filters whether to skip running wptexturize().
		 *
		 * Returning false from the filter will effectively short-circuit wptexturize()
		 * and return the original text passed to the функція instead.
		 *
		 * The filter runs only once, the first time wptexturize() is called.
		 *
		 * @ Since 4.0.0
		 *
		 * @see wptexturize()
		 *
		 * @param bool $run_texturize Whether to short-circuit wptexturize().
		 */
		$run_texturize = apply_filters( 'run_wptexturize', $run_texturize );
		if ( false === $run_texturize ) {
			return $text;
		}

		/* translators: Opening curly double quote. */
		$opening_quote = _x( '“', 'opening curly double quote' );
		/* translators: Closing curly double quote. */
		$closing_quote = _x( '”', 'closing curly double quote' );

		/* translators: Apostrophe, for example in 'cause or can't. */
		$apos = _x( '’', 'apostrophe' );

		/* translators: Prime, for example in 9' (nine feet). */
		$prime = _x( '′', 'prime' );
		/* translators: Double prime, for example in 9" (nine inches). */
		$double_prime = _x( '″', 'double prime' );

		/* translators: Opening curly single quote. */
		$opening_single_quote = _x( '‘', 'opening curly single quote' );
		/* translators: Closing curly single quote. */
		$closing_single_quote = _x( '’', 'closing curly single quote' );

		/ * translators: En dash. */
		$en_dash = _x( '–', 'en dash' );
		/ * translators: Em dash. */
		$em_dash = _x( '—', 'em dash' );

		$default_no_texturize_tags = array( 'pre', 'code', 'kbd', 'style', 'script', 'tt' );
		$default_no_texturize_shortcodes = array('code');

		// Якщо plugin буде реалізовано на autocorrect array, use it.
		if ( isset ( $ wp_cockneyreplace ) ) {
			$ cockney = array_keys ($ wp_cockney replace);
			$cockneyreplace = array_values( $wp_cockneyreplace );
		} else {
			/*
			 * translators: Це є comma-separated list of words that defy syntax of quotations in normal use,
			 * for example... 'Ви не маєте words yet'... is a typical quoted phrase. But when we write
			 * lines of code 'til we have enough of 'em, вони будуть потрібні до insert apostrophes instead of quotes.
			 */
			$cockney = explode(
				',',
				_x(
					"'tain't,'twere,'twas,'tis,'twill,'til,'bout,'nuff,'round,'cause,'em",
					'Comma-separated list of words to texturize у вашій мові'
				)
			);

			$cockneyreplace = explode(
				',',
				_x(
					'’tain’t,’twere,’twas,’tis,’twill,’til,’bout,’ ;nuff,’round,’cause,’em',
					'Comma-separated list of replacement words in your language'
				)
			);
		}

		$static_characters = array_merge( array( '...', '``', '''', '(tm)' ), $cockney );
		$static_replacements = array_merge( array( '…', $opening_quote, $closing_quote, ' ™' ), $cockneyreplace );

		// Pattern-based replacements of characters.
		// Sort the remaining patterns in several arrays for performance tuning.
		$dynamic_characters = array(
			'apos' => array(),
			'quote' => array(),
			'dash' => array(),
		);
		$dynamic_replacements = array(
			'apos' => array(),
			'quote' => array(),
			'dash' => array(),
		);
		$dynamic = array();
		$spaces = wp_spaces_regexp();

		// '99' і '99" є ambiguous над іншими patterns; assume it's abbreviated year at the end of a quotation.
		if ( "'" !== $apos || "'" !== $closing_single_quote ) {
			$dynamic[ '/'(dd)'(?=Z|[.,:;!?)}-]]|>|' . $spaces. ')/'] = $apos_flag. '$1' . $closing_single_quote;
		}
		if ( "'" !== $apos || '"' !== $closing_quote ) {
			$dynamic[ '/'(dd)"(?=Z|[.,:;!?)}-]]|>|' $spaces.')/'] = $apos_flag.'$1'.$closing_quote;
		}

		// '99 '99s '99's (apostrophe) But never '9 or '99% or '999 or '99.0.
		if ( "'" !== $apos ) {
			$dynamic['/'(?=dd(?:Z|(?![%d]|[.,]d)))/'] = $apos_flag;
		}

		// Quoted numbers like '0.42'.
		if ( "'" !== $opening_single_quote && "'" !== $closing_single_quote ) {
			$dynamic[ '/(?<=A|' . $spaces . ')'(d[.,d]*)'/' ] = $open_sq_flag . '$1' . $closing_single_quote;
		}

		// Single quote at start, or preceded by (, {, <, [, ", -, or spaces.
		if ( "'" !== $opening_single_quote ) {
			$dynamic[ '/(?<=A|[([{"-]|<|' . $spaces . ')'/' ] = $open_sq_flag;
		}

		// Apostrophe in a word. Чи не простих, двосторонніх apostrophes, або інших punctuation.
		if ( "'" !== $apos ) {
			$dynamic[ '/(?<!' . $spaces . ')'(?!Z|[.,:;!?"'(){}[]-]|&[lg]t ;|'.$spaces.')/'] = $apos_flag;
		}

		$dynamic_characters['apos'] = array_keys($dynamic);
		$dynamic_replacements['apos'] = array_values($dynamic);
		$dynamic = array();

		// Quoted numbers like "42".
		if ( '"' !== $opening_quote && '"' !== $closing_quote ) {
			$dynamic[ '/(?<=A|' . $spaces . ')"(d[.,d]*)"/' ] = $open_q_flag . '$1' . $closing_quote;
		}

		// Double quote at start, or preceded by (, {, <, [, -, or spaces, і не followed by spaces.
		if ( '"' !== $opening_quote ) {
			$dynamic[ '/(?<=A|[([{-]|<|' . $spaces . ')"(?!' . $spaces . ')/' ] = $open_q_flag;
		}

		$dynamic_characters['quote'] = array_keys($dynamic);
		$dynamic_replacements['quote'] = array_values($dynamic);
		$dynamic = array();

		// Dashes and spaces.
		$dynamic['/---/'] = $em_dash;
		$dynamic[ '/(?<=^|' . $spaces . ')--(?=$|' . $spaces . ')/' ] = $em_dash;
		$dynamic['/(?<!xn)--/'] = $en_dash;
		$dynamic[ '/(?<=^|' . $spaces . ')-(?=$|' . $spaces . ')/' ] = $en_dash;

		$dynamic_characters['dash'] = array_keys($dynamic);
		$dynamic_replacements['dash'] = array_values($dynamic);
	}

	// Необхідний цей час у випадку plugins use thes filters in a context sensitive manner.
	/**
	 * Filters List of HTML elements not to texturize.
	 *
	 * @ Since 2.8.0
	 *
	 * @param string[] $default_no_texturize_tags На array of HTML element names.
	 */
	$no_texturize_tags = apply_filters( 'no_texturize_tags', $default_no_texturize_tags );
	/**
	 * Filters List of shortcodes not to texturize.
	 *
	 * @ Since 2.8.0
	 *
	 * @param string[] $default_no_texturize_shortcodes An array of shortcode names.
	 */
	$no_texturize_shortcodes = apply_filters( 'no_texturize_shortcodes', $default_no_texturize_shortcodes );

	$no_texturize_tags_stack = array();
	$no_texturize_shortcodes_stack = array();

	// Look for shortcodes and HTML elements.

	preg_match_all( '@[/?([^<>&/[]x00-x20=]++)@', $text, $matches );
	$tagnames = array_intersect( array_keys( $shortcode_tags ), $matches[1] );
	$found_shortcodes = ! empty ($ tagnames);
	$shortcode_regex = $found_shortcodes ? _get_wptexturize_shortcode_regex( $tagnames ) : '';
	$regex = _get_wptexturize_split_regex( $shortcode_regex );

	$textarr = preg_split( $regex, $text, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY );

	foreach ( $textarr as &$curl ) {
		// Тільки call _wptexturize_pushpop_element if $curl is a delimiter.
		$ First = $ Curl [0];
		if ( '<' === $first ) {
			if ( '<!--' === substr( $curl, 0, 4 ) ) {
				// This is an HTML comment delimiter.
				continue;
			} else {
				// This is an HTML element delimiter.

				// Replace each & with & unless it already looks like an entity.
				$curl = preg_replace( '/&(?!#(?:d+|x[a-f0-9]+);|[a-z1-4]{1,8};)/i', '& # 038; ', $ Curl);

				_wptexturize_pushpop_element( $curl, $no_texturize_tags_stack, $no_texturize_tags );
			}
		} elseif ( '' === trim( $curl ) ) {
			// This is a newline between delimiters. Performance improves when we check this.
			continue;

		} elseif ( '[' === $first && $found_shortcodes && 1 === preg_match( '/^' . $shortcode_regex . '$/', $curl ) ) {
			// Це є шорсткий код delimiter.

			if ( '[[' !== substr( $curl, 0, 2 ) && ']]' !== substr( $curl, -2 ) ) {
				// Looks like a normal shortcode.
				_wptexturize_pushpop_element( $curl, $no_texturize_shortcodes_stack, $no_texturize_shortcodes );
			} else {
				// Looks like an escaped shortcode.
				continue;
			}
		} elseif ( empty( $no_texturize_shortcodes_stack ) && empty( $no_texturize_tags_stack ) ) {
			// Цей не є іншим, а не тим, що не вказує на те, що він містить цей вміст всередині no_texturize pairs. До texturize.

			$ Curl = str_replace ($ Static_characters, $ Static_replacements, $ Curl);

			if ( false !== strpos( $curl, "'" ) ) {
				$curl = preg_replace( $dynamic_characters['apos'], $dynamic_replacements['apos'], $curl );
				$curl = wptexturize_primes( $curl, "'", $prime, $open_sq_flag, $closing_single_quote);
				$ Curl = str_replace ($ apos_flag, $ Apos, $ Curl);
				$ Curl = str_replace ($ open_sq_flag, $ Openning_single_quote, $ Curl);
			}
			if ( false !== strpos( $curl, '"' ) ) {
				$curl = preg_replace( $dynamic_characters['quote'], $dynamic_replacements['quote'], $curl );
				$curl = wptexturize_primes( $curl, ''', $double_prime, $open_q_flag, $closing_quote );
				$ Curl = str_replace ($ open_q_flag, $ Openning_quote, $ Curl);
			}
			if ( false !== strpos( $curl, '-' ) ) {
				$curl = preg_replace( $dynamic_characters['dash'], $dynamic_replacements['dash'], $curl );
			}

			//9x9 (times), but never 0x9999.
			if ( 1 === preg_match( '/(?<=d)xd/', $curl ) ) {
				// Searching for a digit is 10 times more expensive than for the x, so we avoid doing this one!
				$curl = preg_replace( '/b(d(?(?<=0)[d.,]+|[d.,]*))x(d[d.,] *)b/', '$1×$2', $curl );
			}

			// Replace each & with & unless it already looks like an entity.
			$curl = preg_replace( '/&(?!#(?:d+|x[a-f0-9]+);|[a-z1-4]{1,8};)/i', '& # 038; ', $ Curl);
		}
	}

	return implode('', $textarr);
}

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

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