Question

I have an SVG file that has a bunch of base64 encoded images inline. I want to replace this data with the paths to these images instead.

Path of SVG that shows base64 encoded data:

<image overflow="visible" width="960" height="720" id="Layer_0_1_" xlink:href="
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA8EAAALRCAYAAAB76aEvAAAACXBIWXMAAB
KbAAASmwHgklkMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAIiDZJREFUeNrsvQu
WIzmuLEi6FPmp6nl3ljJbnJXNVmYB75zpvn2rsjJDco5AEqQRDpB0uRQRWZ2qVitSH//wCwMMBv/1
85f/0zn3f7nOw3vv7n3Qb0e/P3J8eoQQDp3/6O+fffyjj975nadrCO69+19eI/7u+/fv7q+//nK
vrxfnfb0eej2/" />

I have the following PHP code so far:

$content = preg_replace('/"data:image\/png;base64(.*)"/', '"pathtologo.png"', $content);

I realize there must me something wrong with the (.*) as it is not replacing anything.

Can anyone offer any help on this matter? Regex has never been my strong suit.

After the replace, I'm expecting:

<image overflow="visible" width="960" height="720" id="Layer_0_1_" xlink:href="
pathtologo.png" />

A small excerpt of the base64 data that is not working with the regex answers provided below:

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

Was it helpful?

Solution

You may want to try this:

<?php
$html = <<< EOF
<image overflow="visible" width="960" height="720" id="Layer_0_1_" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA8EAAALRCAYAAAB76aEvAAAACXBIWXMAABKbAAASmwHgklkMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAIiDZJREFUeNrsvQuWIzmuLEi6FPmp6nl3ljJbnJXNVmYB75zpvn2rsjJDco5AEqQRDpB0uRQRWZ2qVitSH//wCwMMBv/185f/0zn3f7nOw3vv7n3Qb0e/P3J8eoQQDp3/6O+fffyjj975nadrCO69+19eI/7u+/fv7q+//nKvrxfnfb0eej2/" />
EOF;

$newimage = preg_replace('%"(data:image\/png;base64.*)"%sim', '"pathtologo.png"', $html);
echo $newimage ;
?>

DEMO:
http://ideone.com/E8wwAX

EXPLANATION:

Options: Case insensitive; Exact spacing; Dot matches line breaks; ^$ match at line breaks; Greedy quantifiers; Regex syntax only

Match the character “"” literally «"»
Match the regex below and capture its match into backreference number 1 «(data:image\/png;base64.*?)»
   Match the character string “data:image” literally (case insensitive) «data:image»
   Match the character “/” literally «\/»
   Match the character string “png;base64” literally (case insensitive) «png;base64»
   Match any single character «.*?»
      Between zero and unlimited times, as few times as possible, expanding as needed (lazy) «*?»
Match the character “"” literally «"»

"pathtologo.png"

Insert the character string “"pathtologo.png"” literally «"pathtologo.png"»

OTHER TIPS

My theory of why it's not working properly is because the dot (.) is matching everything except the newline character \n, I would suggest using the s modifier allowing the dot to match newlines, or use negation.

Also you may want to add the ? quantifier after .* for a non-greedy match.

$content = preg_replace('~"data:image/png;base64.*"~s', '"pathtologo.png"', $content);
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top