You are better off not using regex at all and using a parser instead, for the reasons set forth in this answer.
That said, you can do it with regex, but it's tricky:
preg_replace('#<a(?![^>]+?href="?http://keepthisdomain.com/foo/bar"?|[^>]+rel="shadowbox[a]").*?>(.*?)</a>#i', '1', $text);
Details on the regex:
<a(?![^>]+?href="?http://keepthisdomain.com/foo/bar"?|[^>]+rel="shadowbox[a]").*?>(.*?)</a>
Out of the following four tags, only the third would be replaced:
<a href="http://keepthisdomain.com/foo/bar">foo</a> // left alone
<a href="http://keepthisdomain.com/foo/bar" rel="shadowbox[a]">foo</a> // left alone
<a href="http://rejectthis.com/foo/bar">foo</a> // REPLACED
<a href="http://rejectthis.com/foo/bar" rel="shadowbox[a]">foo</a> // left alone
Edited with a minor tweak to make it match a literal .
in .com
, using .
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…