0

I'm using the following code to filter out urls from a block of HTML text in PHP.

preg_replace('#<a(?![^>]+?href="?http://keepthisdomain.com/foo/bar"?).*?>(.*?)</a>#i', '\1', $text);

It's intended to replace all url's that do not match the specified url pattern. However I do want to include all tags that have the attribute rel="shadowbox[a]" set.

How can I modify this preg_replace to do that?

3
  • To clarify, which is a match: (1) a tags with the specified URL pattern and the rel="shadowbox[a]" attribute, or (2) a tags with the specified URL pattern or the rel="shadowbox[a]" attribute? Commented Mar 5, 2014 at 21:33
  • P.S. You are better off not using regex at all and using a parser instead, for the reasons set forth in this answer. Commented Mar 5, 2014 at 21:35
  • It's a tag with the rel="shadowbox[a]" attribute. I want to keep those urls (along with all hyperlinks that link to keepthisdomain.com/foo/bar) Commented Mar 5, 2014 at 21:42

1 Answer 1

0

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(?![^>]+?\bhref="?http://keepthisdomain\.com/foo/bar"?|[^>]+\brel="shadowbox\[a\]").*?>(.*?)</a>#i', '\1', $text);

Details on the regex:

<a(?![^>]+?\bhref="?http://keepthisdomain\.com/foo/bar"?|[^>]+\brel="shadowbox\[a\]").*?>(.*?)</a>

Regular expression visualization

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 \.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.