通过PHP正则表达式将id属性添加到超链接

时间:2011-12-02 19:05:15

标签: php class href preg-match-all

我对正则表达式还是比较新的,觉得我的代码太贪婪了。我试图在一段代码中为现有链接添加一个id属性。我的功能是这样的:

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);
}

这会添加我想要的id标记,但它会破坏超链接。例如:

如果原始代码是:<a href="http://www.google.com">Link</a>

而不是<a id="class" href="http://www.google.com">Link</a>

这是给予  <a id="class" href="http">Link</a>

有任何建议或想法吗?

3 个答案:

答案 0 :(得分:2)

不要使用正则表达式来解析XML或HTML。

$doc = new DOMDocument();
$doc->loadHTML($html);
$all_a = $doc->getElementsByTagName('a');
$firsta = $all_a->item(0);
$firsta->setAttribute('id', 'idvalue');
echo $doc->saveHTML($firsta);

答案 1 :(得分:1)

你的正则表达式中有一些过度复杂化:)

此外,不需要循环,因为 preg_replace() 会在相关字符串中点击搜索模式的所有实例。下面的第一个正则表达式将包含a标签中的所有内容,并在最后添加id属性。

$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);

如果您只想捕获 href 属性,可以执行以下操作:

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

答案 2 :(得分:1)

您的第一个子模式([\w.-]*):不匹配,因此会在“http”处停止。

难道你不能只使用一个简单的str_replace()吗?如果这就是你正在做的事情,那么正则表达式似乎有些过分。

$str = str_replace('<a ', '<a id="someID" ', $str);