• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Frage SVG + PHP + RegEx // <path> löschen

xSTVNx

Mitglied
ACHTUNG, bitte diesen Post überspringen :p

Meine Furcht vor RegEx ist zwar überwunden, aber so richtig komme ich damit leider noch nicht klar. :confused:

Ich möchte bevor eine SVG-Datei in PNG umgewandelt wird, die fill-Attribute manipulieren bzw. ein <path>-Element ganz löschen. Ersteres funktioniert (vorrausgesetzt die SVG-Datei folgt meinem Schema), aber das Löschen das Pfades gelingt mir nicht, da mir mal wohl mal wieder nicht klar ist, wie ich Zeichen wie bspw. / oder " korrekt via RegEx matchen lasse.

Also neben a-z, A-Z und 0+9 müssten auch . / = und " bzw. ' getroffen werden.

PHP:
$svg     = file_get_contents('file.svg');
$newcols = ['FF0000','none','880088'];

$id = 1;
foreach( $newcols as $nc ){

  if( $nc == 'none' ){ // delete path
    $svg = preg_replace( '#<path id="a'.$id.'" ([0-9a-fA-F.="-/]+)>#' , '', $svg );
  } else { // change fill
    $svg = preg_replace( '/id="a'.$id.'" fill="#([0-9a-fA-F]{6})/' , 'id="a'.$id.'" fill="#'.$nc , $svg );
  }

$id++;
}

Schema meiner file.svg
XML:
<?xml version="1.0" encoding="UTF-8"?>
<svg ... >
<path id="a3" fill="#d40000" d="..." stroke-width="..." ... />
<path id="a2" fill="#000000" d="..." stroke-width="..." ... />
<path id="a1" fill="#eae44b" d="..." stroke-width="..." ... />
</svg>
 
Zuletzt bearbeitet:
Werbung:
Ok, vergesst diesen Ansatz. Mir war schon klar, dass man das eigtl. mit einem XML-Parser macht, allerdings habe ich dies bisher nicht hinbekommen. Und nachdem ich bereits mehrere Stunden damit verschwendet habe zu googlen, um dann Lösungsansätze zu erhalten, die dann eh nix taugen (oder ich einfach zu doof bin diese gescheit zu reproduzieren.)

Nun habe ich aber wieder ein paar Stunden damit zugebracht, um nun zumindest einen Lichtblick gefunden zu haben, der in einem Test erfolgreich funktioniert hat, ich dieses nun aber leider nicht implementiert bekomme:

PHP:
function removePath($str,$p){
  $svg = simplexml_load_string($str);
  foreach($svg->path as $path){
    if($path['id'] == $p) {
      $dom=dom_import_simplexml($path);
      $dom->parentNode->removeChild($dom);
    }
  }
  return $svg;
}
PHP:
$svg     = file_get_contents('file.svg');
$newcols = ['FF0000','none','880088'];

$id = 1;
foreach( $newcols as $nc ){

  if( $nc == 'none' ){ // delete path
    
    $svg = removePath($svg,'a'.$id);
    
  } else { // change fill
    
    $svg = preg_replace( '/id="a'.$id.'" fill="#([0-9a-fA-F]{6})/' , 'id="a'.$id.'" fill="#'.$nc , $svg );
  }

$id++;
}

XML:
<?xml version="1.0" encoding="UTF-8"?>
<svg ... >
<path id="a3" fill="#d40000" d="..." stroke-width="..." ... />
<path id="a2" fill="#000000" d="..." stroke-width="..." ... />
<path id="a1" fill="#eae44b" d="..." stroke-width="..." ... />
</svg>


Ich erhalte dann die Fehlermeldung:
Code:
Warning: simplexml_load_string(): Entity: line 6: parser error : Start tag expected, '<' not found in ... on line 3
Warning: Invalid argument supplied for foreach() in ... on line 4

Also der Fehler liegt offenbar bei simplexml_load_string($str). Weiß jemand Rat? :confused:
 
Boah, ich habs hinbekommen! :oops::eek::cool: (ohne RegEx, nur SimpleXML)

Ich mach den Code noch hübsch, und poste dann morgen das Ergebnis. Ich muss erstmal schlafen. :D
 
Werbung:
Zurück
Oben