Search code examples
phpclasshrefpreg-match-all

Add id attribute to hyperlinks through PHP Regular Expressions


I am still relatively new to Regular Expressions and feel My code is being too greedy. I am trying to add an id attribute to existing links in a piece of code. My functions is like so:

function addClassHref($str) {
//$str = stripslashes($str);
$preg = "/<[\s]*a[\s]*href=[\s]*[\"\']?([\w.-]*)[\"\']?[^>]*>(.*?)<\/a>/i";
preg_match_all($preg, $str, $match);
foreach ($match[1] as $key => $val) {
    $pattern[] = '/' . preg_quote($match[0][$key], '/') . '/';
    $replace[] = "<a id='buttonRed' href='$val'>{$match[2][$key]}</a>";
}
return preg_replace($pattern, $replace, $str);
}

This adds the id tag like I want but it breaks the hyperlink. For example:

If the original code is : <a href="http://www.google.com">Link</a>

Instead of <a id="class" href="http://www.google.com">Link</a>

It is giving <a id="class" href="http">Link</a>

Any suggestions or thoughts?


Solution

  • You've got some overcomplications in your regex :)

    Also, there's no need for the loop as preg_replace() will hit all the instances of the search pattern in the relevant string. The first regex below will take everything in the a tag and simply add the id attribute on at the end.

    $str = '<a href="http://www.google.com">Link</a>' . "\n" .
    '<a href="http://www.yahoo.com">Link</a>' . "\n" .
    '<a href="http://www.microsoft.com">Link</a>';
    
    $p = "{<\s*a\s*(href=[^>]*)>([^<]*)</a>}i";
    $r = "<a $1 id=\"class\">$2</a>";
    
    echo preg_replace($p, $r, $str);
    

    If you only want to capture the href attribute you could do the following:

    $p = '{<\s*a\s*href=["\']([^"\']*)["\'][^>]*>([^<]*)</a>}i';
    $r = "<a href='$1' id='class'>$2</a>";