2016-09-20 5 views
0

Ich verwende ein kleines Skript, um von absoluten Links zu relativen zu konvertieren. Es funktioniert, aber es muss verbessert werden. Ich bin mir nicht sicher, wie es weitergehen soll. Bitte schauen Sie sich einen Teil des dafür verwendeten Skripts an.Ersetzen letzten Char (String) mit Regex oder DOMDocument

Script:

public function links($path) { 

    $old_url = 'http://test.dev/'; 

    $dir_handle = opendir($path); 
    while($item = readdir($dir_handle)) { 
     $new_path = $path."/".$item; 
     if(is_dir($new_path) && $item != '.' && $item != '..') { 
      $this->links($new_path); 
     } 
     // it is a file 
     else{ 

      if($item != '.' && $item != '..') 
      { 
       $new_url = ''; 
       $depth_count = 1; 
       $folder_depth = substr_count($new_path, '/'); 
       while($depth_count < $folder_depth){ 
        $new_url .= '../'; 
        $depth_count++; 


       } 

       $file_contents = file_get_contents($new_path); 

       $doc = new DOMDocument; 
       @$doc->loadHTML($file_contents); 

       foreach ($doc->getElementsByTagName('a') as $link) { 
         if (substr($link, -1) == "/"){ 
          $link->setAttribute('href', $link->getAttribute('href').'/index.html'); 
         } 

        } 

       $doc->saveHTML(); 
       $file_contents = str_replace($old_url,$new_url,$file_contents); 
       file_put_contents($new_path,$file_contents); 

      } 
     } 
    } 

} 

Wie Sie sehen können habe ich innerhalb while loop fügte hinzu, dass DOMDocument aber es funktioniert nicht. Was ich versuche, hier zu erreichen, ist für jeden Link am Ende index.html hinzuzufügen, wenn das letzte Zeichen in diesem Link ist/

Was mache ich falsch?

Vielen Dank.

+0

Nicht sicher, was Sie falsch machen, aber woher kommt der '$ html', den Sie versuchen zu laden? Es ist nicht in Ihrer Schleife oder Funktion. – Jan

+0

Sie hatten Recht, ich habe Code bearbeitet, aber es funktioniert immer noch nicht. – Morpheus

Antwort

0

Ist das, was Sie wollen?

$file_contents = file_get_contents($new_path); 

$dom = new DOMDocument(); 
$dom->loadHTML($file_contents); 

$xpath = new DOMXPath($dom); 
$links = $xpath->query("//a"); 

foreach ($links as $link) { 
    $href = $link->getAttribute('href'); 
    if (substr($href, -1) === '/') { 
     $link->setAttribute('href', $href."index.html"); 
    } 
} 

$new_file_content = $dom->saveHTML(); 
# save this wherever you want 

Siehe a demo on ideone.com.


Hinweis: Ihr Anruf an $dom->saveHTML() führt zu nichts (dh es gibt keine Variable, die den Ausgang erfasst).

+0

Ich sehe in der Demo, dass es funktioniert, aber wenn ich das versuche, bekomme ich leere Dateien ... index.html oder andere Dateien (contact.html, about.html) sind alle jetzt leer ... Etwas ist nicht gut. .. Wenn ich $ new_path zurückschicke zeigt es nur/index,/about /,/contact/irgendwelche anderen Vorschläge? – Morpheus

+0

@Morpheus: Verwenden Sie einfach 'file_put_contens (" filename_here ", $ dom-> saveHTML())' anstatt mit Ihren Sachen herumzualbern :) – Jan