Regular Expressions 101

Save & Share

  • Regex Version: ver. 1
  • Update Regex
    ctrl+⇧+s
  • Save new Regex
    ctrl+s
  • Add to Community Library

Flavor

  • PCRE2 (PHP >=7.3)
  • PCRE (PHP <7.3)
  • ECMAScript (JavaScript)
  • Python
  • Golang
  • Java 8
  • .NET 7.0 (C#)
  • Rust
  • Regex Flavor Guide

Function

  • Match
  • Substitution
  • List
  • Unit Tests

Tools

Sponsors
There are currently no sponsors. Become a sponsor today!
An explanation of your regex will be automatically generated as you type.
Detailed match information will be displayed here automatically.
  • All Tokens
  • Common Tokens
  • General Tokens
  • Anchors
  • Meta Sequences
  • Quantifiers
  • Group Constructs
  • Character Classes
  • Flags/Modifiers
  • Substitution
  • A single character of: a, b or c
    [abc]
  • A character except: a, b or c
    [^abc]
  • A character in the range: a-z
    [a-z]
  • A character not in the range: a-z
    [^a-z]
  • A character in the range: a-z or A-Z
    [a-zA-Z]
  • Any single character
    .
  • Alternate - match either a or b
    a|b
  • Any whitespace character
    \s
  • Any non-whitespace character
    \S
  • Any digit
    \d
  • Any non-digit
    \D
  • Any word character
    \w
  • Any non-word character
    \W
  • Non-capturing group
    (?:...)
  • Capturing group
    (...)
  • Zero or one of a
    a?
  • Zero or more of a
    a*
  • One or more of a
    a+
  • Exactly 3 of a
    a{3}
  • 3 or more of a
    a{3,}
  • Between 3 and 6 of a
    a{3,6}
  • Start of string
    ^
  • End of string
    $
  • A word boundary
    \b
  • Non-word boundary
    \B

Regular Expression

/
/
gU

Test String

Code Generator

Generated Code

import Foundation // WARNING: You included a flag that Swift doesn't support: U // When this flag is set, it inverts the "greediness" of the quantifiers so that they are not greedy by default, but become greedy if followed by '?'. // As an alternative, this effect can also be achieved by setting a (?U) modifier setting within the pattern or by a question mark behind a quantifier (e.g. .*?). let pattern = #"(?<!\$)(\b\S+?\b)"# let regex = try! NSRegularExpression(pattern: pattern) let testString = ##""" <?php /* Quit */ defined('ABSPATH') OR exit; /** * Cachify */ final class Cachify { /** * Plugin-Optionen * * @since 2.0 * @var array */ private static $options; /** * Cache-Methode * * @since 2.0 * @var object */ private static $method; /** * Method settings * * @since 2.0.9 * @var integer */ const METHOD_DB = 0; const METHOD_APC = 1; const METHOD_HDD = 2; const METHOD_MMC = 3; /** * Minify settings * * @since 2.0.9 * @var integer */ const MINIFY_DISABLED = 0; const MINIFY_HTML_ONLY = 1; const MINIFY_HTML_JS = 2; /** * Pseudo-Konstruktor der Klasse * * @since 2.0.5 * @change 2.0.5 */ public static function instance() { new self(); } /** * Konstruktor der Klasse * * @since 1.0.0 * @change 2.1.3 */ public function __construct() { /* Filter */ if ( ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) OR ( defined('DONOTCACHEPAGE') && DONOTCACHEPAGE ) ) { return; } /* Set defaults */ self::_set_default_vars(); /* Publish-Hooks */ self::_register_publish_hooks(); /* Flush Hook */ add_action( 'cachify_flush_cache', array( __CLASS__, 'flush_total_cache' ) ); add_action( '_core_updated_successfully', array( __CLASS__, 'flush_total_cache' ) ); add_action( 'switch_theme', array( __CLASS__, 'flush_total_cache' ) ); /* Backend */ if ( is_admin() ) { add_action( 'wpmu_new_blog', array( __CLASS__, 'install_later' ) ); add_action( 'delete_blog', array( __CLASS__, 'uninstall_later' ) ); add_action( 'admin_init', array( __CLASS__, 'register_textdomain' ) ); add_action( 'admin_init', array( __CLASS__, 'register_settings' ) ); add_action( 'admin_init', array( __CLASS__, 'process_flush_request' ) ); add_action( 'admin_menu', array( __CLASS__, 'add_page' ) ); add_action( 'admin_enqueue_scripts', array( __CLASS__, 'add_admin_resources' ) ); add_action( 'transition_comment_status', array( __CLASS__, 'touch_comment' ), 10, 3 ); add_action( 'edit_comment', array( __CLASS__, 'edit_comment' ) ); add_action( 'admin_bar_menu', array( __CLASS__, 'add_flush_icon' ), 90 ); add_action( 'dashboard_glance_items', array( __CLASS__, 'add_dashboard_count' ) ); add_action( 'post_submitbox_misc_actions', array( __CLASS__, 'print_flush_dropdown' ) ); add_filter( 'plugin_row_meta', array( __CLASS__, 'row_meta' ), 10, 2 ); add_filter( 'plugin_action_links_' .CACHIFY_BASE, array( __CLASS__, 'action_links' ) ); /* Frontend */ } else { add_action( 'pre_comment_approved', array( __CLASS__, 'pre_comment' ), 99, 2 ); add_action( 'template_redirect', array( __CLASS__, 'manage_cache' ), 0 ); add_action( 'robots_txt', array( __CLASS__, 'robots_txt' ) ); } } /** * Deactivation hook * * @since 2.1.0 * @change 2.1.0 */ public static function on_deactivation() { self::flush_total_cache(); } /** * Activation hook * * @since 1.0 * @change 2.1.0 */ public static function on_activation() { /* Multisite & Network */ if ( is_multisite() && ! empty($_GET['networkwide']) ) { /* Blog-IDs */ $ids = self::_get_blog_ids(); /* Loopen */ foreach ($ids as $id) { switch_to_blog( (int)$id ); self::_install_backend(); } /* Wechsel zurück */ restore_current_blog(); } else { self::_install_backend(); } } /** * Plugin-Installation bei neuen MU-Blogs * * @since 1.0 * @change 1.0 */ public static function install_later($id) { /* Kein Netzwerk-Plugin */ if ( ! is_plugin_active_for_network(CACHIFY_BASE) ) { return; } /* Wechsel */ switch_to_blog( (int)$id ); /* Installieren */ self::_install_backend(); /* Wechsel zurück */ restore_current_blog(); } /** * Eigentliche Installation der Optionen * * @since 1.0 * @change 2.0 */ private static function _install_backend() { add_option( 'cachify', array() ); /* Flush */ self::flush_total_cache(); } /** * Deinstallation des Plugins pro MU-Blog * * @since 1.0 * @change 2.1.0 */ public static function on_uninstall() { /* Global */ global $wpdb; /* Multisite & Network */ if ( is_multisite() && !empty($_GET['networkwide']) ) { /* Alter Blog */ $old = $wpdb->blogid; /* Blog-IDs */ $ids = self::_get_blog_ids(); /* Loopen */ foreach ($ids as $id) { switch_to_blog($id); self::_uninstall_backend(); } /* Wechsel zurück */ switch_to_blog($old); } else { self::_uninstall_backend(); } } /** * Deinstallation des Plugins bei MU & Network * * @since 1.0 * @change 1.0 */ public static function uninstall_later($id) { /* Kein Netzwerk-Plugin */ if ( ! is_plugin_active_for_network(CACHIFY_BASE) ) { return; } /* Wechsel */ switch_to_blog( (int)$id ); /* Installieren */ self::_uninstall_backend(); /* Wechsel zurück */ restore_current_blog(); } /** * Eigentliche Deinstallation des Plugins * * @since 1.0 * @change 1.0 */ private static function _uninstall_backend() { /* Option */ delete_option('cachify'); /* Cache leeren */ self::flush_total_cache(); } /** * Rückgabe der IDs installierter Blogs * * @since 1.0 * @change 1.0 * * @return array Blog-IDs */ private static function _get_blog_ids() { /* Global */ global $wpdb; return $wpdb->get_col("SELECT blog_id FROM `$wpdb->blogs`"); } /** * Eigenschaften des Objekts * * @since 2.0 * @change 2.0.7 */ private static function _set_default_vars() { /* Optionen */ self::$options = self::_get_options(); /* APC */ if ( self::$options['use_apc'] === self::METHOD_APC && Cachify_APC::is_available() ) { self::$method = new Cachify_APC; /* HDD */ } else if ( self::$options['use_apc'] === self::METHOD_HDD && Cachify_HDD::is_available() ) { self::$method = new Cachify_HDD; /* MEMCACHED */ } else if ( self::$options['use_apc'] === self::METHOD_MMC && Cachify_MEMCACHED::is_available() ) { self::$method = new Cachify_MEMCACHED; /* DB */ } else { self::$method = new Cachify_DB; } } /** * Rückgabe der Optionen * * @since 2.0 * @change 2.1.2 * * @return array $diff Array mit Werten */ private static function _get_options() { return wp_parse_args( get_option('cachify'), array( 'only_guests' => 1, 'compress_html' => self::MINIFY_DISABLED, 'cache_expires' => 12, 'without_ids' => '', 'without_agents' => '', 'use_apc' => self::METHOD_DB, 'reset_on_comment' => 0 ) ); } /** * Hinzufügen der Action-Links * * @since 1.0 * @change 2.0.2 * * @param string $data Ursprungsinhalt der dynamischen robots.txt * @return string $data Modifizierter Inhalt der robots.txt */ public static function robots_txt($data) { /* HDD only */ if ( self::$options['use_apc'] !== self::METHOD_HDD ) { return $data; } /* Pfad */ $path = parse_url(site_url(), PHP_URL_PATH); /* Ausgabe */ $data .= sprintf( 'Disallow: %s/wp-content/cache/%s', ( empty($path) ? '' : $path ), "\n" ); return $data; } /** * Hinzufügen der Action-Links * * @since 1.0 * @change 1.0 * * @param array $data Bereits existente Links * @return array $data Erweitertes Array mit Links */ public static function action_links($data) { /* Rechte? */ if ( ! current_user_can('manage_options') ) { return $data; } return array_merge( $data, array( sprintf( '<a href="%s">%s</a>', add_query_arg( array( 'page' => 'cachify' ), admin_url('options-general.php') ), __('Settings') ) ) ); } /** * Meta-Links des Plugins * * @since 0.5 * @change 2.0.5 * * @param array $input Bereits vorhandene Links * @param string $page Aktuelle Seite * @return array $data Modifizierte Links */ public static function row_meta($input, $page) { /* Rechte */ if ( $page != CACHIFY_BASE ) { return $input; } return array_merge( $input, array( '<a href="https://flattr.com/t/1327625" target="_blank">Flattr</a>', '<a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&amp;hosted_button_id=5RDDW9FEHGLG6" target="_blank">PayPal</a>' ) ); } /** * Hinzufügen eines Admin-Bar-Menüs * * @since 1.2 * @change 2.1.4 * * @param object Objekt mit Menü-Eigenschaften */ public static function add_flush_icon($wp_admin_bar) { /* Aussteigen */ if ( ! is_admin_bar_showing() OR ! is_super_admin() ) { return; } /* Hinzufügen */ $wp_admin_bar->add_menu( array( 'id' => 'cachify', 'href' => add_query_arg('_cachify', 'flush'), 'parent' => 'top-secondary', 'title' => '<span class="ab-icon dashicons dashicons-post-trash" style="top:2px;margin:0"></span>', 'meta' => array( 'title' => __('Flush the cachify cache', 'cachify') ) ) ); } /** * Anzeige des Spam-Counters auf dem Dashboard * * @since 2.0.0 * @change 2.1.3 */ public static function add_dashboard_count() { /* Cache size */ $size = self::get_cache_size(); /* Caching method */ $method = call_user_func( array( self::$method, 'stringify‎_method' ) ); /* Print the link */ echo sprintf( '<li> <a href="%s" class="cachify-icon cachify-icon--%s" title="%s: %s"> %s Cache </a> </li>', add_query_arg( array( 'page' => 'cachify' ), admin_url('options-general.php') ), esc_attr(strtolower($method)), __('Caching method', 'cachify'), esc_attr($method), ( empty($size) ? __('Empty', 'cachify') : size_format($size) ) ); } /** * Rückgabe der Cache-Größe * * @since 2.0.6 * @change 2.0.6 * * @param integer $size Cache-Größe in Bytes */ public static function get_cache_size() { if ( ! $size = get_transient('cachify_cache_size') ) { /* Auslesen */ $size = (int) call_user_func( array( self::$method, 'get_stats' ) ); /* Speichern */ set_transient( 'cachify_cache_size', $size, 60 * 15 ); } return $size; } /** * Verarbeitung der Plugin-Meta-Aktionen * * @since 0.5 * @change 2.1.3 * * @param array $data Metadaten der Plugins */ public static function process_flush_request($data) { /* Leer? */ if ( empty($_GET['_cachify']) OR $_GET['_cachify'] !== 'flush' OR ! is_super_admin() ) { return; } /* Global */ global $wpdb; /* Multisite & Network */ if ( is_multisite() && is_plugin_active_for_network(CACHIFY_BASE) ) { /* Alter Blog */ $old = $wpdb->blogid; /* Blog-IDs */ $ids = self::_get_blog_ids(); /* Loopen */ foreach ($ids as $id) { switch_to_blog($id); self::flush_total_cache(); } /* Wechsel zurück */ switch_to_blog($old); /* Notiz */ add_action( 'network_admin_notices', array( __CLASS__, 'flush_notice' ) ); } else { /* Leeren */ self::flush_total_cache(); /* Notiz */ add_action( 'admin_notices', array( __CLASS__, 'flush_notice' ) ); } } /** * Hinweis nach erfolgreichem Cache-Leeren * * @since 1.2 * @change 2.1.3 */ public static function flush_notice() { /* Kein Admin */ if ( ! is_super_admin() ) { return false; } echo sprintf( '<div id="message" class="updated"><p><strong>%s</strong></p></div>', __('Cachify cache is flushed.', 'cachify') ); } /** * Löschung des Cache beim Kommentar-Editieren * * @since 0.1.0 * @change 2.1.2 * * @param integer $id ID des Kommentars */ public static function edit_comment($id) { if ( self::$options['reset_on_comment'] ) { self::flush_total_cache(); } else { self::remove_page_cache_by_post_id( get_comment($id)->comment_post_ID ); } } /** * Löschung des Cache beim neuen Kommentar * * @since 0.1.0 * @change 2.1.2 * * @param mixed $approved Kommentar-Status * @param array $comment Array mit Eigenschaften * @return mixed $approved Kommentar-Status */ public static function pre_comment($approved, $comment) { /* Approved comment? */ if ( $approved === 1 ) { if ( self::$options['reset_on_comment'] ) { self::flush_total_cache(); } else { self::remove_page_cache_by_post_id( $comment['comment_post_ID'] ); } } return $approved; } /** * Löschung des Cache beim Editieren der Kommentare * * @since 0.1 * @change 2.1.2 * * @param string $new_status Neuer Status * @param string $old_status Alter Status * @param object $comment Array mit Eigenschaften */ public static function touch_comment($new_status, $old_status, $comment) { if ( $new_status != $old_status ) { if ( self::$options['reset_on_comment'] ) { self::flush_total_cache(); } else { self::remove_page_cache_by_post_id( $comment->comment_post_ID ); } } } /** * Generierung von Publish-Hooks für Custom Post Types * * @since 2.0.3 * @change 2.1.3 */ private static function _register_publish_hooks() { /* Available post types */ $post_types = get_post_types( array('public' => true) ); /* Empty data? */ if ( empty($post_types) ) { return; } /* Loopen */ foreach ( $post_types as $post_type ) { add_action( 'publish_' .$post_type, array( __CLASS__, 'publish_post_types' ), 10, 2 ); add_action( 'publish_future_' .$post_type, array( __CLASS__, 'flush_total_cache' ) ); } } /** * Removes the post type cache on updates * * @since 2.0.3 * @change 2.1.3 * * @param integer $post_ID Post ID */ public static function publish_post_types($post_ID, $post) { /* No Post_ID? */ if ( empty($post_ID) OR empty($post) ) { return; } /* Post status check */ if ( ! in_array( $post->post_status, array('publish', 'future') ) ) { return; } /* Check for post var AND flush */ if ( ! isset($_POST['_cachify_remove_post_type_cache_on_update']) ) { return self::flush_total_cache(); } /* Security */ check_admin_referer(CACHIFY_BASE, '_cachify_status_nonce'); /* Save as var */ $remove_post_type_cache = (int)$_POST['_cachify_remove_post_type_cache_on_update']; /* Save as user meta */ update_user_meta( get_current_user_id(), '_cachify_remove_post_type_cache_on_update', $remove_post_type_cache ); /* Remove cache OR flush */ if ( $remove_post_type_cache ) { self::remove_page_cache_by_post_id( $post_ID ); } else { self::flush_total_cache(); } } /** * Removes a page id from cache * * @since 2.0.3 * @change 2.1.3 * * @param integer $post_ID Post ID */ public static function remove_page_cache_by_post_id($post_ID) { self::remove_page_cache_by_url( get_permalink( $post_ID ) ); } /** * Removes a page url from cache * * @since 0.1 * @change 2.1.3 * * @param string $url Page URL */ public static function remove_page_cache_by_url($url) { call_user_func( array( self::$method, 'delete_item' ), self::_cache_hash( $url ), $url ); } /** * Rückgabe der Cache-Gültigkeit * * @since 2.0 * @change 2.0 * * @return intval Gültigkeit in Sekunden */ private static function _cache_expires() { return 60 * 60 * self::$options['cache_expires']; } /** * Rückgabe des Cache-Hash-Wertes * * @since 0.1 * @change 2.0 * * @param string $url URL für den Hash-Wert [optional] * @return string Cachify-Hash-Wert */ private static function _cache_hash($url = '') { return md5( empty($url) ? ( $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] ) : ( parse_url($url, PHP_URL_HOST) . parse_url($url, PHP_URL_PATH) ) ) . '.cachify'; } /** * Splittung nach Komma * * @since 0.9.1 * @change 1.0 * * @param string $input Zu splittende Zeichenkette * @return array Konvertierter Array */ private static function _preg_split($input) { return (array)preg_split('/,/', $input, -1, PREG_SPLIT_NO_EMPTY); } /** * Prüfung auf Index * * @since 0.6 * @change 1.0 * * @return boolean TRUE bei Index */ private static function _is_index() { return basename($_SERVER['SCRIPT_NAME']) != 'index.php'; } /** * Prüfung auf Mobile Devices * * @since 0.9.1 * @change 2.0.7 * * @return boolean TRUE bei Mobile */ private static function _is_mobile() { return ( strpos(TEMPLATEPATH, 'wptouch') or strpos(TEMPLATEPATH, 'carrington') or strpos(TEMPLATEPATH, 'jetpack') or strpos(TEMPLATEPATH, 'handheld') ); } /** * Prüfung auf eingeloggte und kommentierte Nutzer * * @since 2.0.0 * @change 2.0.5 * * @return boolean $diff TRUE bei "vermerkten" Nutzern */ private static function _is_logged_in() { /* Eingeloggt */ if ( is_user_logged_in() ) { return true; } /* Cookie? */ if ( empty($_COOKIE) ) { return false; } /* Loopen */ foreach ( $_COOKIE as $k => $v) { if ( preg_match('/^(wp-postpass|wordpress_logged_in|comment_author)_/', $k) ) { return true; } } } /** * Definition der Ausnahmen für den Cache * * @since 0.2 * @change 2.1.1 * * @return boolean TRUE bei Ausnahmen * * @hook boolean cachify_skip_cache */ private static function _skip_cache() { /* No cache hook */ if ( apply_filters('cachify_skip_cache', false) ) { return true; } /* Conditional Tags */ if ( self::_is_index() or is_search() or is_404() or is_feed() or is_trackback() or is_robots() or is_preview() or post_password_required() ) { return true; } /* Plugin options */ $options = self::$options; /* Request vars */ if ( !empty($_POST) OR (!empty($_GET) && get_option('permalink_structure')) ) { return true; } /* Logged in */ if ( $options['only_guests'] && self::_is_logged_in() ) { return true; } /* Mobile request */ if ( self::_is_mobile() ) { return true; } /* Post IDs */ if ( $options['without_ids'] && is_singular() ) { if ( in_array( $GLOBALS['wp_query']->get_queried_object_id(), self::_preg_split($options['without_ids']) ) ) { return true; } } /* User Agents */ if ( $options['without_agents'] && isset($_SERVER['HTTP_USER_AGENT']) ) { if ( array_filter( self::_preg_split($options['without_agents']), create_function('$a', 'return strpos($_SERVER["HTTP_USER_AGENT"], $a);') ) ) { return true; } } return false; } /** * Minimierung des HTML-Codes * * @since 0.9.2 * @change 2.0.9 * * @param string $data Zu minimierender Datensatz * @return string $data Minimierter Datensatz * * @hook array cachify_minify_ignore_tags */ private static function _minify_cache($data) { /* Disabled? */ if ( ! self::$options['compress_html'] ) { return($data); } /* Ignore this html tags */ $ignore_tags = (array)apply_filters( 'cachify_minify_ignore_tags', array( 'textarea', 'pre' ) ); /* Add the script tag */ if ( self::$options['compress_html'] !== self::MINIFY_HTML_JS ) { $ignore_tags[] = 'script'; } /* Empty blacklist? | TODO: Make better */ if ( ! $ignore_tags ) { return($data); } /* Convert to string */ $ignore_regex = implode('|', $ignore_tags); /* Minify */ $cleaned = preg_replace( array( '/<!--[^\[><](.*?)-->/s', '#(?ix)(?>[^\S ]\s*|\s{2,})(?=(?:(?:[^<]++|<(?!/?(?:' .$ignore_regex. ')\b))*+)(?:<(?>' .$ignore_regex. ')\b|\z))#' ), array( '', ' ' ), (string) $data ); /* Fault */ if ( strlen($cleaned) <= 1 ) { return($data); } return $cleaned; } /** * Zurücksetzen des kompletten Cache * * @since 0.1 * @change 2.0 */ public static function flush_total_cache() { /* DB */ Cachify_DB::clear_cache(); /* APC */ Cachify_APC::clear_cache(); /* HDD */ Cachify_HDD::clear_cache(); /* MEMCACHED */ Cachify_MEMCACHED::clear_cache(); /* Transient */ delete_transient('cachify_cache_size'); } /** * Zuweisung des Cache * * @since 0.1 * @change 2.0 * * @param string $data Inhalt der Seite * @return string $data Inhalt der Seite */ public static function set_cache($data) { /* Leer? */ if ( empty($data) ) { return ''; } /* Speicherung */ call_user_func( array( self::$method, 'store_item' ), self::_cache_hash(), self::_minify_cache($data), self::_cache_expires() ); return $data; } /** * Verwaltung des Cache * * @since 0.1 * @change 2.0 */ public static function manage_cache() { /* Kein Caching? */ if ( self::_skip_cache() ) { return; } /* Daten im Cache */ $cache = call_user_func( array( self::$method, 'get_item' ), self::_cache_hash() ); /* Kein Cache? */ if ( empty($cache) ) { ob_start('Cachify::set_cache'); return; } /* Cache verarbeiten */ call_user_func( array( self::$method, 'print_cache' ), $cache ); } /** * Einbindung von CSS * * @since 1.0 * @change 2.1.3 */ public static function add_admin_resources($hook) { /* Hooks check */ if ( $hook !== 'index.php' AND $hook !== 'post.php' ) { return; } /* Plugin data */ $plugin_data = get_plugin_data(CACHIFY_FILE); /* Register css */ switch($hook) { case 'index.php': wp_enqueue_style( 'cachify-dashboard', plugins_url('css/dashboard.min.css', CACHIFY_FILE), array(), $plugin_data['Version'] ); break; case 'post.php': wp_enqueue_script( 'cachify-post', plugins_url('js/post.min.js', CACHIFY_FILE), array('jquery'), $plugin_data['Version'], true ); break; default: break; } } /** * Display a combo select on post publish box * * @since 2.1.3 * @change 2.1.3 */ public static function print_flush_dropdown() { /* Post page only */ if ( empty($GLOBALS['pagenow']) OR $GLOBALS['pagenow'] !== 'post.php' ) { return; } /* Published posts only */ if ( empty($GLOBALS['post']) OR ! is_object($GLOBALS['post']) OR $GLOBALS['post']->post_status !== 'publish' ) { return; } /* Security */ wp_nonce_field(CACHIFY_BASE, '_cachify_status_nonce'); /* Already saved? */ $current_action = (int)get_user_meta( get_current_user_id(), '_cachify_remove_post_type_cache_on_update', true ); /* Init vars */ $dropdown_options = ''; $available_options = array(__('Total cache', 'cachify'), __('Page cache', 'cachify')); /* Select options */ foreach( $available_options as $key => $value ) { $dropdown_options .= sprintf( '<option value="%1$d" %3$s>%2$s</option>', $key, $value, selected($key, $current_action, false) ); } /* Output */ echo sprintf( '<div class="misc-pub-section" style="border-top:1px solid #eee"> <label for="cachify_status"> %1$s: <span id="output-cachify-status">%2$s</span> </label> <a href="#" class="edit-cachify-status hide-if-no-js">%3$s</a> <div class="hide-if-js"> <select name="_cachify_remove_post_type_cache_on_update" id="cachify_status"> %4$s </select> <a href="#" class="save-cachify-status hide-if-no-js button">%5$s</a> <a href="#" class="cancel-cachify-status hide-if-no-js button-cancel">%6$s</a> </div> </div>', __('Remove', 'cachify'), $available_options[$current_action], __('Edit'), $dropdown_options, __('OK'), __('Cancel') ); } /** * Einfügen der Optionsseite * * @since 1.0 * @change 2.0.2 */ public static function add_page() { $page = add_options_page( 'Cachify', 'Cachify', 'manage_options', 'cachify', array( __CLASS__, 'options_page' ) ); } /** * Verfügbare Cache-Methoden * * @since 2.0.0 * @change 2.1.3 * * @param array $methods Array mit verfügbaren Arten */ private static function _method_select() { /* Defaults */ $methods = array( self::METHOD_DB => __('Database', 'cachify'), self::METHOD_APC => 'APC', self::METHOD_HDD => __('Hard disk', 'cachify'), self::METHOD_MMC => 'Memcached' ); /* APC */ if ( ! Cachify_APC::is_available() ) { unset($methods[1]); } /* Memcached? */ if ( ! Cachify_MEMCACHED::is_available() ) { unset($methods[3]); } /* HDD */ if ( ! Cachify_HDD::is_available() ) { unset($methods[2]); } return $methods; } /** * Minify cache dropdown * * @since 2.1.3 * @change 2.1.3 * * @return array Key => value array */ private static function _minify_select() { return array( self::MINIFY_DISABLED => __('No minify', 'cachify'), self::MINIFY_HTML_ONLY => 'HTML', self::MINIFY_HTML_JS => 'HTML + Inline JavaScript' ); } /** * Register the language file * * @since 2.1.3 * @change 2.1.3 */ public static function register_textdomain() { load_plugin_textdomain( 'cachify', false, 'cachify/lang' ); } /** * Registrierung der Settings * * @since 1.0 * @change 1.0 */ public static function register_settings() { register_setting( 'cachify', 'cachify', array( __CLASS__, 'validate_options' ) ); } /** * Valisierung der Optionsseite * * @since 1.0.0 * @change 2.1.3 * * @param array $data Array mit Formularwerten * @return array Array mit geprüften Werten */ public static function validate_options($data) { /* Cache leeren */ self::flush_total_cache(); /* Hinweis */ if ( self::$options['use_apc'] != $data['use_apc'] && $data['use_apc'] >= self::METHOD_APC ) { add_settings_error( 'cachify_method_tip', 'cachify_method_tip', sprintf( '%s [<a href="http://playground.ebiene.de/cachify-wordpress-cache/" target="_blank">?</a>]', __('The server configuration file (e.g. .htaccess) needs to be adjusted', 'cachify') ), 'updated' ); } /* Rückgabe */ return array( 'only_guests' => (int)(!empty($data['only_guests'])), 'compress_html' => (int)$data['compress_html'], 'cache_expires' => (int)(@$data['cache_expires']), 'without_ids' => (string)sanitize_text_field(@$data['without_ids']), 'without_agents' => (string)sanitize_text_field(@$data['without_agents']), 'use_apc' => (int)$data['use_apc'], 'reset_on_comment' => (int)(!empty($data['reset_on_comment'])) ); } /** * Darstellung der Optionsseite * * @since 1.0 * @change 2.1.3 */ public static function options_page() { ?> <style> #cachify_settings input[type="text"], #cachify_settings input[type="number"] { height: 30px; } </style> <div class="wrap" id="cachify_settings"> <h2> Cachify </h2> <form method="post" action="options.php"> <?php settings_fields('cachify') ?> <?php $options = self::_get_options() ?> <table class="form-table"> <tr valign="top"> <th scope="row"> <?php _e('Cache method', 'cachify') ?> </th> <td> <label for="cachify_cache_method"> <select name="cachify[use_apc]" id="cachify_cache_method"> <?php foreach( self::_method_select() as $k => $v ) { ?> <option value="<?php echo esc_attr($k) ?>" <?php selected($options['use_apc'], $k); ?>><?php echo esc_html($v) ?></option> <?php } ?> </select> </label> </td> </tr> <tr valign="top"> <th scope="row"> <?php _e('Cache validity', 'cachify') ?> </th> <td> <label for="cachify_cache_expires"> <input type="number" min="0" step="1" name="cachify[cache_expires]" id="cachify_cache_expires" value="<?php echo $options['cache_expires'] ?>" class="small-text" /> <?php _e('Hours', 'cachify') ?> </label> </td> </tr> <tr valign="top"> <th scope="row"> <?php _e('Cache generation', 'cachify') ?> </th> <td> <fieldset> <label for="cachify_only_guests"> <input type="checkbox" name="cachify[only_guests]" id="cachify_only_guests" value="1" <?php checked('1', $options['only_guests']); ?> /> <?php _e('No cache generation by logged in users', 'cachify') ?> </label> <br /> <label for="cachify_reset_on_comment"> <input type="checkbox" name="cachify[reset_on_comment]" id="cachify_reset_on_comment" value="1" <?php checked('1', $options['reset_on_comment']); ?> /> <?php _e('Flush the cache at new comments', 'cachify') ?> </label> </fieldset> </td> </tr> <tr valign="top"> <th scope="row"> <?php _e('Cache exceptions', 'cachify') ?> </th> <td> <fieldset> <label for="cachify_without_ids"> <input type="text" name="cachify[without_ids]" id="cachify_without_ids" value="<?php echo $options['without_ids'] ?>" /> Post/Pages-IDs </label> <br /> <label for="cachify_without_agents"> <input type="text" name="cachify[without_agents]" id="cachify_without_agents" value="<?php echo $options['without_agents'] ?>" /> Browser User-Agents </label> </fieldset> </td> </tr> <tr valign="top"> <th scope="row"> <?php _e('Cache minify', 'cachify') ?> </th> <td> <label for="cachify_compress_html"> <select name="cachify[compress_html]" id="cachify_compress_html"> <?php foreach( self::_minify_select() as $k => $v ) { ?> <option value="<?php echo esc_attr($k) ?>" <?php selected($options['compress_html'], $k); ?>> <?php echo esc_html($v) ?> </option> <?php } ?> </select> </label> </td> </tr> <tr valign="top"> <th scope="row"> <input type="submit" class="button-primary" value="<?php _e('Save Changes') ?>" /> </th> <td> <a href="http://playground.ebiene.de/cachify-wordpress-cache/" target="_blank"><?php _e('Manual', 'cachify') ?></a> &bull; <a href="http://playground.ebiene.de/cachify-wordpress-cache/#book" target="_blank"><?php _e('Books', 'cachify') ?></a> &bull; <a href="https://flattr.com/t/1327625" target="_blank">Flattr</a> &bull; <a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&amp;hosted_button_id=5RDDW9FEHGLG6" target="_blank">PayPal</a> </td> </tr> </table> </form> </div><?php } } """## let stringRange = NSRange(location: 0, length: testString.utf16.count) let matches = regex.matches(in: testString, range: stringRange) var result: [[String]] = [] for match in matches { var groups: [String] = [] for rangeIndex in 1 ..< match.numberOfRanges { let nsRange = match.range(at: rangeIndex) guard !NSEqualRanges(nsRange, NSMakeRange(NSNotFound, 0)) else { continue } let string = (testString as NSString).substring(with: nsRange) groups.append(string) } if !groups.isEmpty { result.append(groups) } } print(result)

Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for Swift 5.2, please visit: https://developer.apple.com/documentation/foundation/nsregularexpression