$re = '/<\s*tag\b[^>]*?(?<=\s)attribute1\s*=\s*\"([^\"]*)\"[^>]*>/iU';
$str = '<tag attribute1="\'text123\'" />
<TAG attribute2="\'true\'" attribute1="\'text1\'"/>
<tag attribute2="\'true\'"/>
< tag
type="apple" title="Golden apple"
ATTRIBUTE1="value" />
<!-- This one should not match -->
<tagger attribute1="something">
<!-- But this one yes -->
<tag data-id="6735"
attribute1="\'some more text\'"
required >
Whatever in here
</tag>
</tagger>
<!--
Should not match if "attribute1" is part of an other attribute name.
As attributes can contain a hyphen, we can\'t use \\battribute1 because \\b
will not consider the hyphen as part of a word. This is why we have to
use the positive lookbehind (?<=\\s)
-->
<tag matching="false" data-attribute1="" />';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
// Print the entire match result
var_dump($matches);
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for PHP, please visit: http://php.net/manual/en/ref.pcre.php