[php] eregi_replace werkt opeens niet meer

Pagina: 1
Acties:

  • TromboneFreakus
  • Registratie: Juli 2001
  • Laatst online: 01-08-2023
Aangezien ik niet de beschikking heb over een database waarin ik alle tekst kan plaatsen, heb ik met eenvoudige code en losse html-bestandjes toch geprobeerd een site te maken die geheel met templates werkt. Dit is me prima gelukt door alle links die in de HTML-bestandjes staan, te vervangen door links die verwijzen naar de template. Dit werkt prima voor interne links.

Het gaat echter mis met externe links. Dan probeert mijn php-document dat externe bestand in te lezen, wat uiteraard niet altijd goed gaat, maar zeker ook niet de bedoeling is (bijv. ivm copyright).

Eerst even wat code. Dit is het gedeelte dat de links verandert:

PHP:
1
2
3
4
5
6
7
8
9
10
11
$huidigedir = eregi_replace ("/home/users/j/u/jubab/www","",realpath($file));
$dirvanfile = dirname($huidigedir);
    
$invoer= implode("",file($file));   
$invoer = eregi_replace("href='","href='".$PHP_SELF."?file=.".$dirvanfile."/",$invoer);
$invoer = eregi_replace("src='","src='".$dirvanfile."/",$invoer);
        
        
//hier moeten alle verwijzingen naar een root-dir weer goed worden gezet (want die zijn nu
//dubbel, bijv. ?file=./welkom//geschiedenis/
$invoer = eregi_replace(".".$dirvanfile."//","./",$invoer);


De eerste twee regels kunnen volgens mij nog wel efficienter, maar het werkt in ieder geval prima, met dien verstande dat het bestand zelf in de root dir staat.

Met externe links gaat het mis. In PHP-code uitgedrukt, krijg je dan een dergelijke output:

PHP:
1
echo "href='".$PHP_SELF."?file=.".$dirvanfile."/http://'";


Dat wil dus zeggen:
code:
1
a href="/phpjubal.php?file=./eenofanderedir/http://


Ik dacht dit met de volgende opdracht te kunnen opvangen:

PHP:
1
$invoer = eregi_replace("href='".$PHP_SELF."?file=.".$dirvanfile."/http://","http://",$invoer);


Echter, er verandert niks aan de output. Heeft iemand enig idee wat ik fout doe?

Is de code overigens duidelijk? Alvast bedankt.

  • TromboneFreakus
  • Registratie: Juli 2001
  • Laatst online: 01-08-2023
NAast bovenstaande pogingen heb ik ook al geprobeerd of het probleem mogelijk veroorzaakt wordt door het vervangen van de dubbele slash '//'. Op de website van PHP wordt er immers herhaardelijk in de user comments op vreemd gedrag van PHP bij slashes gewezen. Echter ook het vervangen van slechts "http:" levert geen enkel resultaat op.

Heeft iemand mogelijk ervaring met dit probleem met eregi_replace, of ziet iemand de fout waar ik overheen lees? Bedankt

  • Elroy
  • Registratie: April 2000
  • Laatst online: 29-05 21:33

Elroy

Zelda!!!

Probeer dit eens :

PHP:
1
$invoer = eregi_replace("href=&#039\?file=(\$dirvanfile)","http://\\2",$invoer);

Specs Computer


  • TromboneFreakus
  • Registratie: Juli 2001
  • Laatst online: 01-08-2023
Ik heb je code geprobeerd, maar zonder resultaat. Ook heb ik de code zelf nog iets netter gemaakt, maar helaas is ook dat zonder resultaat.

Even de praktijk. In de map /informatie/ staat een document dat verwijst naar http://www.deborch.nl, met als gevolg dat deze link ontstaat:

<a href="/phpjubal.php?file=./informatie/http://www.deborch.nl">

Logisch gedacht, kom ik tot de conclusie dat het overbodige deel van de string gelijk is aan dit:
PHP:
1
echo ($PHP_SELF."?file=.".$dirvanfile."/http://");


Wanneer ik dat dus vervang door slechts "http://", zou het moeten werken en moet een 'gewone' link naar een externe site ontstaan. Echter, onderstaande code haalt niks uit:

PHP:
1
$invoer = eregi_replace($PHP_SELF."?file=.".$dirvanfile."/http://","http://",$invoer);



Kijkende in de source, is de echo echter EXACT gelijk aan het overbodige deel van de string en zou de vervangtruuk moeten werken. Mijn testlayout en dit gewraakte document kun je vinden op http://www.jubal.vuurwerk...matie/repetitieruimte.htm en zoals je daar ziet ontstaat die verkeerde link nog steeds. :?

Aangezien je code nog niks opleverde is bovenstaande code weer van mijn hand. Misschien moet ik echter wel iets met dat gedeelte "\\2" dat je gebruikt doen. Kun je a.u.b. toelichten wat dit doet?

  • Elroy
  • Registratie: April 2000
  • Laatst online: 29-05 21:33

Elroy

Zelda!!!

Wat jij wilt doen kan niet!
Als je de $dirvanfile erin stopt dan krijg je slashes (/) die niet geback slashed zijn (\/), misschien kan je dit oplossen door er addslashes in te stoppen ofzo.
Of je moet het helemaal anders doen zoals :

PHP:
1
$invoer = eregi_replace("(.*)(http)(.*)","http\\3",$invoer);


Of zoiets.
Bij \\3 haal je het derde tussen haakje terug

Specs Computer


  • D2k
  • Registratie: Januari 2001
  • Laatst online: 31-08 10:19

D2k

ben je van phpversie veranderd? (misschien zonder te weten)

Doet iets met Cloud (MS/IBM)


  • TromboneFreakus
  • Registratie: Juli 2001
  • Laatst online: 01-08-2023
Elroy schreef op 30 augustus 2002 @ 16:24:
Wat jij wilt doen kan niet!
Als je de $dirvanfile erin stopt dan krijg je slashes (/) die niet geback slashed zijn (\/), misschien kan je dit oplossen door er addslashes in te stoppen ofzo.
Dat klopt theoretisch ongetwijfeld best, maar waarom kan ik wel eerst de links zo aanpassen dat ze in de template geladen worden? Daarin wordt ook diezelfde variabele gebruikt... :?
Of je moet het helemaal anders doen zoals :

PHP:
1
$invoer = eregi_replace("(.*)(http)(.*)","http\\3",$invoer);


Of zoiets.
Inderdaad, of zoiets. Ik moet eerlijk bekennen dat ik niet genoeg van PHP weet om te snappen wat hier staat, maar het is wel duidelijk dat dit enigszins op de goede weg is.

Wat er nu echter gebeurt is het volgende: alle tekst voor de laatste 'http' wordt niet getoond, alles daarna inclusief die 'http' zelf wordt wel getoond. In dit document is het laatste item dat extern verwijst een plaatje. Zoals je ziet blijft daarvan slechts de source over (src=" verdwijnt dus) en alles wat daarna nog in het document staat. Op het origineel kun je zien wat er eigenlijk moest staan.
Bij \\3 haal je het derde tussen haakje terug
Sorry, wat bedoel je hiermee?

  • TromboneFreakus
  • Registratie: Juli 2001
  • Laatst online: 01-08-2023
D2k schreef op 30 augustus 2002 @ 16:25:
ben je van phpversie veranderd? (misschien zonder te weten)
De site staat bij Vuurwerk en die zullen ongetwijfeld de laatste PHP-versie wel geinstalleerd hebben (al was het maar vanwege veiligheid). Dit template script wordt in een ruk uitgevoerd en de code om de externe links weer goed te zetten is gewoon een van de regels in het php-document. Ik denk dan ook niet dat het iets met een versieverschil te maken heeft, dan zou de eregi_replace daarboven ook kuren moeten geven

  • TromboneFreakus
  • Registratie: Juli 2001
  • Laatst online: 01-08-2023
Kan ik overigens eregi_replace niet omgekeerd goed laten werken, door in de eerste twee regels te stellen dat hij alles moet vervangen (dus laten laden in de template met ?file=), behalve wanneer er http in de string voorkomt? Of kan dit niet met eregi_replace?

  • TromboneFreakus
  • Registratie: Juli 2001
  • Laatst online: 01-08-2023
Elroy schreef op 30 augustus 2002 @ 16:24:
misschien kan je dit oplossen door er addslashes in te stoppen ofzo.
PHP:
1
$invoer = eregi_replace(addslashes($PHP_SELF."?file=.".$dirvanfile."/http://"),addslashes("http://"),$invoer);


Werkt helaas niet. Ook
PHP:
1
$invoer = eregi_replace($PHP_SELF."?file=.".addslashes($dirvanfile)."/http://","http://",$invoer);
helaas niet. Ik zal nog verder uitproberen, in ieder geval bedankt voor het meedenken tot nu toe..

  • TromboneFreakus
  • Registratie: Juli 2001
  • Laatst online: 01-08-2023
Ik heb de eerste code iets netter en daarmee denk ik ook overzichtelijker gemaakt. Het onderstaande werkt allemaal perfect, de variabele $invoer staat voor de inhoud van het opgevraagde document (als lange string).

PHP:
1
2
3
4
5
6
7
// alle links veranderen naar de variant dat ze geladen worden in template
$invoer = eregi_replace("href=\x22","href=\x22$PHP_SELF?file=.$dirvanfile/",$invoer);
$invoer = eregi_replace("src=\x22","src=\x22.$dirvanfile/",$invoer);
        
//hier moeten alle verwijzingen naar een root-dir weer goed worden gezet (want die zijn nu
//dubbel, bijv. ?file=./welkom//geschiedenis/
$invoer = eregi_replace(".".$dirvanfile."//","./",$invoer);


Het probleem is dus eenvoudig gesteld dat deze code de links naar externe pagina's niet mag vervangen of dat die code weer moet worden terugveranderd. Dat laatste heb ik geprobeerd, als laatste met het volgende (dat niet werkt):

PHP:
1
$invoer = eregi_replace("href=\x22$PHP_SELF?file=.$dirvanfile\/http:","http:",$invoer);


Laat ik het overbodige deel van de code uitvoeren door php
PHP:
1
echo ("href=\x22$PHP_SELF?file=.$dirvanfile/http:");
en kijk en vergelijk ik vervolgens in de source van het uitgevoerde document, dan is dit EXACT gelijk aan het overbodige deel van de code in de link. Toch wordt het niet vervangen.... :'(

Wie ziet de fout? Elroy, je oplossing lijkt erg dicht bij de oplossing te liggen, maar is iets te krachtig zoals ik al schreef. Zou je misschien nog een wijziging daarop kunnen posten?

  • Elroy
  • Registratie: April 2000
  • Laatst online: 29-05 21:33

Elroy

Zelda!!!

Geef effe alleen de code die het niet doet, want ik snap er nu effe helemaal niks meer van.
Geef ook meteen aan hoe de input ($invoer) eruit ziet (voor en na).

En misschien is het ook wel effe handig als je effe de manual leest.
Want bijvb. deze teken $ kan je niet zo gebruiken als jij hem wilt gebruiken, want eregi_replace ziet $ aan als de laatste teken ofzo. Dus die zou je zo \$ moeten neerzetten. Dat is net zo met een vraagteken enzo.

Kijk anders even bij de volgende links :

http://www.phpbuilder.com/columns/dario19990616.php3
http://www.developers-resources.com/stories/01/10/25/0549771
http://www.alt-php-faq.org/local/85/

Specs Computer


  • TromboneFreakus
  • Registratie: Juli 2001
  • Laatst online: 01-08-2023
Elroy schreef op 31 augustus 2002 @ 19:47:

En misschien is het ook wel effe handig als je effe de manual leest.
Want bijvb. deze teken $ kan je niet zo gebruiken als jij hem wilt gebruiken, want eregi_replace ziet $ aan als de laatste teken ofzo. Dus die zou je zo \$ moeten neerzetten. Dat is net zo met een vraagteken enzo.
Hartelijk dank! :)

Ik had allerlei tekens voorzien van escape, maar niet gedacht aan het vraagteken. Stom stom stom, maar ja... het script is dan ook misschien wat te snel in elkaar gezet. In ieder geval hartelijk dank.

Wat dus wel werkt in het volgende:
PHP:
1
$invoer = eregi_replace("href=\x22$PHP_SELF\?file=.$dirvanfile\/http:","href=\x22http:",$invoer);
Kijk anders even bij de volgende links :

http://www.phpbuilder.com/columns/dario19990616.php3
En dit document is idd heel waardevol hiervoor.
Pagina: 1