I have the following code in which I am replacing urls with hyperlinked anchor tags,
JavaScript
x
public function urlify($string)
{
//FIND URLS INSIDE TEXT
//The Regular Expression filter
$reg_exUrl = "/(((http(s?)(://))?([w]{3}.)?)([a-z0-9]+.)*([a-z|0-9])+.(com(.au)?|org|me|net|ly|be|gl|info|(co(.))?uk|ca|nz|tv)((/[^s]+)*)+)/i";
// Check if there is a url in the text
if (preg_match($reg_exUrl, $string, $url)) {
if (strpos($url[0], ":") === false) {
$link = 'http://' . $url[0];
} else {
$link = $url[0];
}
// make the urls hyper links
$string = preg_replace($reg_exUrl, '<a href="' . $link . '" title="' . $url[0] . '" target="_blank">' . $url[0] . '</a>', $string);
}
return $string;
}
But I want to ignore all img tags while searching for urls, I have no idea how can I go for it.
Advertisement
Answer
As per @Biesor and @Nigel Ren I came up with this,
JavaScript
public function urlify($string)
{
//FIND URLS INSIDE TEXT
//The Regular Expression filter
$reg_exUrl = "/(((http(s?)(://))?([w]{3}.)?)([a-z0-9]+.)*([a-z|0-9])+.(com(.au)?|org|me|net|ly|be|gl|info|(co(.))?uk|ca|nz|tv)((/[^s]+)*)+)/i";
$htmlDom = new DOMDocument;
$htmlDom->loadHTML($string);
$imageTags = $htmlDom->getElementsByTagName('img');
$img_srcs = array();
foreach($imageTags as $imageTag){
$img_srcs[] = $imageTag->getAttribute('src');
$imageTag->setAttribute('src', '');
}
$string = $htmlDom->saveHTML();
// Check if there is a url in the text
if (preg_match($reg_exUrl, $string, $url)) {
if (strpos($url[0], ":") === false) {
$link = 'http://' . $url[0];
} else {
$link = $url[0];
}
// make the urls hyper links
$string = preg_replace($reg_exUrl, '<a href="' . $link . '" title="' . $url[0] . '" target="_blank">' . $url[0] . '</a>', $string);
}
foreach($imageTags as $key => $imageTag){
$imageTag->setAttribute('src', $img_srcs[$key]);
}
$string = $htmlDom->saveHTML();
$p = $htmlDom->getElementsByTagName('p')->item(0);
if($p)
{
$string = implode(
"",
array_map([$htmlDom, 'saveHTML'], iterator_to_array($p->childNodes))
);
}
return $string;
}
For the time being I am using this till some better solution comes up.