bbp_make_clickable( string $text )

Convert plaintext URI to HTML links.

Description

Converts URI, www and ftp, and email addresses. Finishes by fixing links within links.

This custom version of WordPress’s make_clickable() skips links inside of pre and code tags.

Parameters

$text

(Required) Content to convert URIs.

Return

(string) Content with converted URIs.

Source

File: bp-forums/common/formatting.php

360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
function bbp_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 .= bbp_make_clickable( $chunk );
                }
            }
        } else {
            $ret = " {$piece} "; // Pad with whitespace to simplify the regexes
            $ret = apply_filters( 'bbp_make_clickable', $ret );
            $ret = substr( $ret, 1, -1 ); // Remove our whitespace padding.
            $r .= $ret;
        }
    }
 
    // Cleanup of accidental links within links
    return preg_replace( '#(<a([ \r\n\t]+[^>]+?>|>))<a [^>]+?>([^>]+?)</a></a>#i', "$1$3</a>", $r );
}

Changelog

Changelog
Version Description
bbPress (r4941) Introduced.

Questions?

We're always happy to help with code or other questions you might have! Search our developer docs, contact support, or connect with our sales team.