我对正则表达式还是比较新的,觉得我的代码太贪婪了。我试图在一段代码中为现有链接添加一个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>
有任何建议或想法吗?
答案 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);