Don't attempt to make links inside attributes clickable. Props duck_ azaozz. fixes #20418
git-svn-id: http://svn.automattic.com/wordpress/trunk@20443 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
parent
2dd485a823
commit
be5802b0f1
|
@ -1468,49 +1468,59 @@ function _make_email_clickable_cb($matches) {
|
||||||
*
|
*
|
||||||
* @since 0.71
|
* @since 0.71
|
||||||
*
|
*
|
||||||
* @param string $ret Content to convert URIs.
|
* @param string $text Content to convert URIs.
|
||||||
* @return string Content with converted URIs.
|
* @return string Content with converted URIs.
|
||||||
*/
|
*/
|
||||||
function make_clickable( $ret ) {
|
function make_clickable( $text ) {
|
||||||
// Long strings might contain expensive edge cases ...
|
$r = '';
|
||||||
if ( 10000 < strlen( $ret ) ) {
|
$textarr = preg_split( '/(<[^<>]+>)/', $text, -1, PREG_SPLIT_DELIM_CAPTURE ); // split out HTML tags
|
||||||
$r = '';
|
foreach ( $textarr as $piece ) {
|
||||||
// ... break it up
|
if ( empty( $piece ) || ( $piece[0] == '<' && ! preg_match('|^<\s*[\w]{1,20}+://|', $piece) ) ) {
|
||||||
foreach ( _split_str_by_whitespace( $ret, 2100 ) as $chunk ) { // 2100: Extra room for scheme and leading and trailing paretheses
|
$r .= $piece;
|
||||||
if ( 2101 < strlen( $chunk ) ) {
|
continue;
|
||||||
$r .= $chunk; // Too big, no whitespace: bail.
|
}
|
||||||
} else {
|
|
||||||
$r .= make_clickable( $chunk );
|
// 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 to simplify the regexes
|
||||||
|
|
||||||
|
$url_clickable = '~
|
||||||
|
([\\s(<.,;:!?]) # 1: Leading whitespace, or punctuation
|
||||||
|
( # 2: URL
|
||||||
|
[\\w]{1,20}+:// # Scheme and hier-part prefix
|
||||||
|
(?=\S{1,2000}\s) # Limit to URLs less than about 2000 characters long
|
||||||
|
[\\w\\x80-\\xff#%\\~/@\\[\\]*(+=&$-]*+ # Non-punctuation URL character
|
||||||
|
(?: # Unroll the Loop: Only allow puctuation URL character if followed by a non-punctuation URL character
|
||||||
|
[\'.,;:!?)] # Punctuation URL character
|
||||||
|
[\\w\\x80-\\xff#%\\~/@\\[\\]*(+=&$-]++ # Non-punctuation URL character
|
||||||
|
)*
|
||||||
|
)
|
||||||
|
(\)?) # 3: Trailing closing parenthesis (for parethesis balancing post processing)
|
||||||
|
~xS'; // The regex is a non-anchored pattern and does not have a single fixed starting character.
|
||||||
|
// Tell PCRE to spend more time optimizing since, when used on a page load, it will probably be used several times.
|
||||||
|
|
||||||
|
$ret = preg_replace_callback( $url_clickable, '_make_url_clickable_cb', $ret );
|
||||||
|
|
||||||
|
$ret = preg_replace_callback( '#([\s>])((www|ftp)\.[\w\\x80-\\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;
|
||||||
}
|
}
|
||||||
return $r;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$ret = " $ret "; // Pad with whitespace to simplify the regexes
|
|
||||||
|
|
||||||
$url_clickable = '~
|
|
||||||
([\\s(<.,;:!?]) # 1: Leading whitespace, or punctuation
|
|
||||||
( # 2: URL
|
|
||||||
[\\w]{1,20}+:// # Scheme and hier-part prefix
|
|
||||||
(?=\S{1,2000}\s) # Limit to URLs less than about 2000 characters long
|
|
||||||
[\\w\\x80-\\xff#%\\~/@\\[\\]*(+=&$-]*+ # Non-punctuation URL character
|
|
||||||
(?: # Unroll the Loop: Only allow puctuation URL character if followed by a non-punctuation URL character
|
|
||||||
[\'.,;:!?)] # Punctuation URL character
|
|
||||||
[\\w\\x80-\\xff#%\\~/@\\[\\]*(+=&$-]++ # Non-punctuation URL character
|
|
||||||
)*
|
|
||||||
)
|
|
||||||
(\)?) # 3: Trailing closing parenthesis (for parethesis balancing post processing)
|
|
||||||
~xS'; // The regex is a non-anchored pattern and does not have a single fixed starting character.
|
|
||||||
// Tell PCRE to spend more time optimizing since, when used on a page load, it will probably be used several times.
|
|
||||||
|
|
||||||
$ret = preg_replace_callback( $url_clickable, '_make_url_clickable_cb', $ret );
|
|
||||||
|
|
||||||
$ret = preg_replace_callback('#([\s>])((www|ftp)\.[\w\\x80-\\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);
|
|
||||||
|
|
||||||
// Cleanup of accidental links within links
|
// Cleanup of accidental links within links
|
||||||
$ret = preg_replace("#(<a( [^>]+?>|>))<a [^>]+?>([^>]+?)</a></a>#i", "$1$3</a>", $ret);
|
$r = preg_replace( '#(<a( [^>]+?>|>))<a [^>]+?>([^>]+?)</a></a>#i', "$1$3</a>", $r );
|
||||||
return substr( $ret, 1, -1 ); // Remove our whitespace padding.
|
return $r;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue