\]]|^)(\()?([\w]+?://(?:[\w\\x80-\\xff\#$%&~/=?@\[\](+-]|[.,;:](?![\s<]|(\))?([\s]|$))|(?(1)\)(?![\s<.,;:]|$)|\)))+)#is';
//Used by the edit and unlink callbacks
var $old_url = '';
var $new_url = '';
/**
* Parse a string for plaintext URLs
*
* @param string $content The text to parse.
* @param string $base_url The base URL. Ignored.
* @param string $default_link_text Default link text.
* @return array An array of new blcLinkInstance objects.
*/
function parse( $content, $base_url = '', $default_link_text = '' ) {
//Don't want to detect URLs inside links or tag attributes -
//there are already other parsers for that.
//Avoid http://...
$content = preg_replace( '#]*>.*?#si', '', $content );
//HTML tags are treated as natural boundaries for plaintext URLs
//(since we strip tags, we must place another boundary char where they were).
//The closing tag of [shortcodes] is also treated as a boundary.
$content = str_replace( array( '<', '>', '[/' ), array( "\n<", ">\n", "\n[/" ), $content );
//Finally, kill all tags.
$content = strip_tags( $content );
//Find all URLs
$found = preg_match_all(
$this->url_regexp,
$content,
$matches
);
$instances = array();
if ( $found ) {
//Create a new instance for each match
foreach ( $matches[2] as $match ) {
$url = $this->validate_url( trim( $match ) );
if ( false == $url ) {
continue;
}
//Create a new link instance.
$instance = new blcLinkInstance();
$instance->set_parser( $this );
$instance->raw_url = $match;
$instance->link_text = $match;
$link_obj = new blcLink( $url ); //Creates or loads the link
$instance->set_link( $link_obj );
$instances[] = $instance;
}
}
return $instances;
}
/**
* Validate and sanitize a URL.
*
* @param string $url
* @return bool|string A valid URL, or false if the URL is not valid.
*/
protected function validate_url( $url ) {
//Do a little bit of validation
$url = esc_url_raw( $url );
if ( empty( $url ) ) {
return false;
}
if ( function_exists( 'filter_var' ) ) {
//Note: filter_var() is no panacea as it accepts many invalid URLs
if ( ! filter_var( $url, FILTER_VALIDATE_URL ) ) {
return false;
}
}
$parts = @parse_url( $url );
if ( empty( $parts['host'] ) || ! strpos( $parts['host'], '.' ) ) {
return false;
}
return $url;
}
/**
* Change all occurrences of a given plaintext URLs to a new URL.
*
* @param string $content Look for URLs in this string.
* @param string $new_url Change them to this URL.
* @param string $old_url The URL to look for.
* @param string $old_raw_url The raw, not-normalized URL. Optional.
*
* @return array|WP_Error If successful, the return value will be an associative array with two
* keys : 'content' - the modified content, and 'raw_url' - the new raw, non-normalized URL used
* for the modified links. In most cases, the returned raw_url will be equal to the new_url.
*/
function edit( $content, $new_url, $old_url, $old_raw_url = '' ) {
$this->new_url = $new_url;
if ( empty( $old_raw_url ) ) {
$this->old_url = $old_url;
} else {
$this->old_url = $old_raw_url;
}
return array(
'content' => preg_replace_callback( $this->url_regexp, array( &$this, 'edit_callback' ), $content ),
'raw_url' => $new_url,
'link_text' => $new_url,
);
}
function edit_callback( $match ) {
if ( $match[2] == $this->old_url ) {
return $this->new_url;
} else {
return $match[0];
}
}
/**
* Remove all occurrences of a specific plaintext URL.
*
* @param string $content Look for URLs in this string.
* @param string $url The URL to look for.
* @param string $raw_url The raw, non-normalized version of the URL to look for. Optional.
* @return string Input string with all matching plaintext URLs removed.
*/
function unlink( $content, $url, $raw_url = '' ) {
if ( empty( $raw_url ) ) {
$this->old_url = $url;
} else {
$this->old_url = $raw_url;
}
return preg_replace_callback( $this->url_regexp, array( &$this, 'unlink_callback' ), $content );
}
function unlink_callback( $match ) {
if ( $match[2] == $this->old_url ) {
return '';
} else {
return $match[0];
}
}
}