Hi there regex wizards!,
I have a document with multiple guids spread over multiple lines. I need to replace these guids with content from a file who’s name is the found guid. I’ve tried this:
preg_replace('/^[a-fd]{8}(-[a-fd]{4}){4}[a-fd]{8}$/i', file_get_contents("${1}.php"), $lines);
but it fails to find guids (and thus, also complains about ${1} not being found).
here is the multi-line string:
"
// Code in page
//Run requested command:
37906e3a-62f3-4d83-a8e0-9ad64a6a5228
de2dd82d-df13-4a8f-a760-cbc6e3db29d0
// bindings from HTML
af6236de-cf5d-447b-a9d5-28549aebd0fa
"
What I am doing wrong?
Thanks, Avi
Advertisement
Answer
You can use
preg_replace_callback(
'/^(?:s?[a-fd]){8}s?(?:-(?:s?[a-fd]){4}){4}(?:s?[a-fd]){8}$/mi',
function($m) {
return file_get_contents(preg_replace("~s+~", "", $m[0]) . ".php");
},
$lines
);
See the regex demo.
The s?
inside the pattern allows matching an optional whitespace anywhere in between each char of a match. Also, with regard to the regex pattern, you need to use m
flag to make ^
and $
match line boundaries (start/end of the line, not just start/end of the whole string).
You can’t pass ${1}
into a function within preg_replace
replacement argument, you need a preg_replace_callback
so that the match could be evaluated before passing it to a function.