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.