WordPress.org

Make WordPress Core

Changeset 20443


Ignore:
Timestamp:
04/11/12 21:14:13 (2 years ago)
Author:
ryan
Message:

Don't attempt to make links inside attributes clickable. Props duck_ azaozz. fixes #20418

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/wp-includes/formatting.php

    r20307 r20443  
    14691469 * @since 0.71 
    14701470 * 
    1471  * @param string $ret Content to convert URIs. 
     1471 * @param string $text Content to convert URIs. 
    14721472 * @return string Content with converted URIs. 
    14731473 */ 
    1474 function make_clickable( $ret ) { 
    1475     // Long strings might contain expensive edge cases ... 
    1476     if ( 10000 < strlen( $ret ) ) { 
    1477         $r = ''; 
    1478         // ... break it up 
    1479         foreach ( _split_str_by_whitespace( $ret, 2100 ) as $chunk ) { // 2100: Extra room for scheme and leading and trailing paretheses 
    1480             if ( 2101 < strlen( $chunk ) ) { 
    1481                 $r .= $chunk; // Too big, no whitespace: bail. 
    1482             } else { 
    1483                 $r .= make_clickable( $chunk ); 
     1474function make_clickable( $text ) { 
     1475    $r = ''; 
     1476    $textarr = preg_split( '/(<[^<>]+>)/', $text, -1, PREG_SPLIT_DELIM_CAPTURE ); // split out HTML tags 
     1477    foreach ( $textarr as $piece ) { 
     1478        if ( empty( $piece ) || ( $piece[0] == '<' && ! preg_match('|^<\s*[\w]{1,20}+://|', $piece) ) ) { 
     1479            $r .= $piece; 
     1480            continue; 
     1481        } 
     1482 
     1483        // Long strings might contain expensive edge cases ... 
     1484        if ( 10000 < strlen( $piece ) ) { 
     1485            // ... break it up 
     1486            foreach ( _split_str_by_whitespace( $piece, 2100 ) as $chunk ) { // 2100: Extra room for scheme and leading and trailing paretheses 
     1487                if ( 2101 < strlen( $chunk ) ) { 
     1488                    $r .= $chunk; // Too big, no whitespace: bail. 
     1489                } else { 
     1490                    $r .= make_clickable( $chunk ); 
     1491                } 
    14841492            } 
     1493        } else { 
     1494            $ret = " $piece "; // Pad with whitespace to simplify the regexes 
     1495 
     1496            $url_clickable = '~ 
     1497                ([\\s(<.,;:!?])                                        # 1: Leading whitespace, or punctuation 
     1498                (                                                      # 2: URL 
     1499                    [\\w]{1,20}+://                                # Scheme and hier-part prefix 
     1500                    (?=\S{1,2000}\s)                               # Limit to URLs less than about 2000 characters long 
     1501                    [\\w\\x80-\\xff#%\\~/@\\[\\]*(+=&$-]*+         # Non-punctuation URL character 
     1502                    (?:                                            # Unroll the Loop: Only allow puctuation URL character if followed by a non-punctuation URL character 
     1503                        [\'.,;:!?)]                            # Punctuation URL character 
     1504                        [\\w\\x80-\\xff#%\\~/@\\[\\]*(+=&$-]++ # Non-punctuation URL character 
     1505                    )* 
     1506                ) 
     1507                (\)?)                                                  # 3: Trailing closing parenthesis (for parethesis balancing post processing) 
     1508            ~xS'; // The regex is a non-anchored pattern and does not have a single fixed starting character. 
     1509                  // Tell PCRE to spend more time optimizing since, when used on a page load, it will probably be used several times. 
     1510 
     1511            $ret = preg_replace_callback( $url_clickable, '_make_url_clickable_cb', $ret ); 
     1512 
     1513            $ret = preg_replace_callback( '#([\s>])((www|ftp)\.[\w\\x80-\\xff\#$%&~/.\-;:=,?@\[\]+]+)#is', '_make_web_ftp_clickable_cb', $ret ); 
     1514            $ret = preg_replace_callback( '#([\s>])([.0-9a-z_+-]+)@(([0-9a-z-]+\.)+[0-9a-z]{2,})#i', '_make_email_clickable_cb', $ret ); 
     1515 
     1516            $ret = substr( $ret, 1, -1 ); // Remove our whitespace padding. 
     1517            $r .= $ret; 
    14851518        } 
    1486         return $r; 
    1487     } 
    1488  
    1489     $ret = " $ret "; // Pad with whitespace to simplify the regexes 
    1490  
    1491     $url_clickable = '~ 
    1492         ([\\s(<.,;:!?])                                        # 1: Leading whitespace, or punctuation 
    1493         (                                                      # 2: URL 
    1494             [\\w]{1,20}+://                                # Scheme and hier-part prefix 
    1495             (?=\S{1,2000}\s)                               # Limit to URLs less than about 2000 characters long 
    1496             [\\w\\x80-\\xff#%\\~/@\\[\\]*(+=&$-]*+         # Non-punctuation URL character 
    1497             (?:                                            # Unroll the Loop: Only allow puctuation URL character if followed by a non-punctuation URL character 
    1498                 [\'.,;:!?)]                            # Punctuation URL character 
    1499                 [\\w\\x80-\\xff#%\\~/@\\[\\]*(+=&$-]++ # Non-punctuation URL character 
    1500             )* 
    1501         ) 
    1502         (\)?)                                                  # 3: Trailing closing parenthesis (for parethesis balancing post processing) 
    1503     ~xS'; // The regex is a non-anchored pattern and does not have a single fixed starting character. 
    1504           // Tell PCRE to spend more time optimizing since, when used on a page load, it will probably be used several times. 
    1505  
    1506     $ret = preg_replace_callback( $url_clickable, '_make_url_clickable_cb', $ret ); 
    1507  
    1508     $ret = preg_replace_callback('#([\s>])((www|ftp)\.[\w\\x80-\\xff\#$%&~/.\-;:=,?@\[\]+]+)#is', '_make_web_ftp_clickable_cb', $ret); 
    1509     $ret = preg_replace_callback('#([\s>])([.0-9a-z_+-]+)@(([0-9a-z-]+\.)+[0-9a-z]{2,})#i', '_make_email_clickable_cb', $ret); 
     1519    } 
    15101520 
    15111521    // Cleanup of accidental links within links 
    1512     $ret = preg_replace("#(<a( [^>]+?>|>))<a [^>]+?>([^>]+?)</a></a>#i", "$1$3</a>", $ret); 
    1513     return substr( $ret, 1, -1 ); // Remove our whitespace padding. 
     1522    $r = preg_replace( '#(<a( [^>]+?>|>))<a [^>]+?>([^>]+?)</a></a>#i', "$1$3</a>", $r ); 
     1523    return $r; 
    15141524} 
    15151525 
Note: See TracChangeset for help on using the changeset viewer.