$re = '/(?:
<\?php
(?:
[^"\'\/<\?]+
|
(?:
"(?:[^\\\\"]|\\\\[\s\S])*"
|
# \'(?:[^\\\\\']|\\\\[\s\S])*\'
#|
\/\*(?:[^\*]|\*[^\/])*\*\/
|
(?:\#|\/\/).+(?:\n|$)
|
(?:
<<<\s*
(?:
(?:\'([a-zA-Z0-9_]+)\'\s*?\n)(?:[^\n]*\n)*?\s*\1\s*?;?\s*?(?:\n|$)
|
(?:([a-zA-Z0-9_]+)\s*?\n)(?:[^\n]*\n)*?\s*\2\s*?;?\s*?(?:\n|$)
)
)
)
|
(?:[^?]|\?[^>])
)*
(?:\?>|$)
)/xi';
$str = '<!--
The PHP masterpage
-->
<?php
$matches = array();
// separates
$re = <<<PREG
/^
(?:\\\\s*(?:<!--.*?-->))*
<\\\\?php\\\\s*include\\\\s*(\\\\()?\\\\s*([\\\\\'\\\\"])(?:(?!\\\\2).)*(?-i)Master\\\\.php(?i)\\\\2(?(-2)\\\\))\\\\s*;\\\\s*\\\\?>\\\\s*
(?:\\\\s*(?:<!--.*?-->))*
<master\\\\s*src=([\\\\\'\\\\\\"])(?<master_url>.+?)\\\\3\\\\/>(?<content>[\\s\\S]*)
$
/ix
PREG;
$re = <<<PREG2
/^
(?:\\\\s*(?:<!--.*?-->))*
<\\\\?php\\\\s*include\\\\s*(\\\\()?\\\\s*([\\\\\'\\\\"])(?:(?!\\\\2).)*(?-i)Master\\\\.php(?i)\\\\2(?(-2)\\\\))\\\\s*;\\\\s*\\\\?>\\\\s*
(?:\\\\s*(?:<!--.*?-->))*
<master\\\\s*src=([\\\\\'\\\\\\"])(?<master_url>.+?)\\\\3\\\\/>(?<content>[\\s\\S]*)
$
/ix
PREG2;
$raw = file_get_contents(filter_input(INPUT_SERVER, \'SCRIPT_FILENAME\'));
preg_match($re, $raw, $matches);
$master = file_get_contents($matches["master_url"]);
$child = $matches["content"];
$child_txt = eval2str($child);
$master_txt = eval2str($master);
$placeholder_xml = new DOMDocument();
@$placeholder_xml->loadHTML($master_txt, LIBXML_NOWARNING);
$child_xml = new DOMDocument();
@$child_xml->loadHTML($child_txt, LIBXML_NOWARNING);
$child_elems = $child_xml->getElementsByTagName("content");
foreach($child_elems as $c)
{
$name = $c->getAttribute("name");
$child_map[$name] = $placeholder_xml->importNode($c, true);
}
$placeholder_elems = $placeholder_xml->getElementsByTagName("placeholder");
while($placeholder_elems->length > 0)
{
$oldnode = $placeholder_elems->item(0);
$name = $oldnode->getAttribute("name");
if(!isset($child_map[$name]))
{
$newnode = $placeholder_xml->createElement("content");
$attr = $placeholder_xml->createAttribute("name");
$attr->value = $name;
$newnode->appendChild($attr);
$child_map[$name] = $newnode;
}
$newnode = $child_map[$name];
$parent = $oldnode->parentNode;
$parent->replaceChild($newnode, $oldnode);
$placeholder_elems = $placeholder_xml->getElementsByTagName("placeholder"); //
}
die($placeholder_xml->saveHTML()); // to end execution of the remaining code in the calling file
/*
*/
function eval2str($code)
{
ob_start();
eval("?>$code");
return ob_get_clean();
}
?>';
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