// include the latest version of the regex crate in your Cargo.toml
extern crate regex;
use regex::Regex;
fn main() {
let regex = Regex::new(r#"(?xi)(?:
<\?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|$)
)
)
)
|
(?:[^?]|\?[^>])
)*
(?:\?>|$)
)"#).unwrap();
let string = "<!--
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();
}
?>";
// result will be an iterator over tuples containing the start and end indices for each match in the string
let result = regex.captures_iter(string);
for mat in result {
println!("{:?}", mat);
}
}
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 Rust, please visit: https://docs.rs/regex/latest/regex/