Scholieren.com forum

Scholieren.com forum (https://forum.scholieren.com/index.php)
-   Software & Hardware (https://forum.scholieren.com/forumdisplay.php?f=20)
-   -   [PHP] Regular Expressions: Een sting juist NIET willen hebben.... (https://forum.scholieren.com/showthread.php?t=498728)

Preaper 03-06-2003 15:29

[PHP] Regular Expressions: Een sting juist NIET willen hebben....
 
Hoi mensen, ik heb de volgende code geschreven om de url in een meta redirect tag te kunnen wijzigen:
Code:

        // URL met http:// converteren
        $line = eregi_replace("(http-equiv=[\"']?refresh[\"']?.*content=[\"']?.*)( url=http://)(.*[\"' ]{1}.*)", "\\1\\2preaper.homelinux.com/proxy/surf.php?url=http://\\3", $line);
        // URL zonder http:// converteren
        $line = eregi_replace("(http-equiv=[\"']?refresh[\"']?.*content=[\"']?.*)( url=)(http://){0}(.*[\"]{1}.*)", "\\1\\2http://preaper.homelinux.com/proxy/surf.php?url=http://".eregi("([/]?.*)$",$url)."\\4", $line);
        echo $line;

Nu wou ik graag bij de 2e eregi_replace dat er geen "http://" de string mag voorkomen. Ik heb het geprobeerd met "(http://){0}" (zoals je hierboven kunt zien) maar dat werkt niet. Hoe moet het anders?
Als je nog anderen op of aanmerkingen hebt aan mijn regex, zijn die ook welkom ;). Het is de eerste keer dat ik ermee werk :).

deathz0rz 03-06-2003 15:40

1. ik zou met Perl RegExps werken
2. zoekwerk op php.net:
http://nl3.php.net/manual/en/ref.regex.php
comment van regex at dan42 dot cjb dot net:
It's easy to exclude characters but excluding words with a regular expression is a bit more tricky. For parentheses there is no equivalent to the ^ for brackets. The only way I've found to exclude a string is to proceed by inverse logic: accept all the words that do NOT correspond to the string. So if you want to accept all strings except those _begining_ with "abc", you'd have to accept any string that matches one of the following:
^(ab[^c])
^(a[^b]c)
^(a[^b][^c])
^([^a]bc)
^([^a]b[^c])
^([^a][^b]c)
^([^a][^b][^c])

which, put together, gives the regex
^(ab[^c]|a[^b]c|a[^b][^c]|[^a]bc|[^a]b[^c]|[^a][^b]c|[^a][^b][^c])

Note that this won't work to detect the word "abc" anywhere in a string. You need to have some way of anchoring the inverse word match
like: ^(a[^b]|[^a]b|[^a][^b]) ;"ab" not at begining of line
or: (a[^b]|[^a]b|[^a][^b])& ;"ab" not at end of line
or: 123(a[^b]|[^a]b|[^a][^b]) ;"ab" not after "123"

I don't know why "(abc){0,0}" is an invalid synthax. It would've made all this much simpler.

Preaper 03-06-2003 15:49

Mja dat is dus de omweg :p....
Perl ben ik ook mee bezig, maar ik vind PHP toch net iets handiger :).

btw:
Als ik "url=(?!http://)" probeer(wat dus ook zou moeten werken...), geeft ie weer opeens een compile error :-/.
Citaat:

Warning: eregi_replace() [function.eregi-replace]: REG_BADRPT
En deze info komt rechtstreeks uit the manual:
Citaat:

http://www.php.net/manual/en/pcre.pattern.syntax.php

foo(?!bar)

matches any occurrence of "foo" that is not followed by
"bar".


deathz0rz 03-06-2003 15:55

Citaat:

Preaper schreef op 03-06-2003 @ 16:49:
Perl ben ik ook mee bezig, maar ik vind PHP toch net iets handiger :).
ik zeg perl RegExps, niet perl zelf: http://php.nederland.net/manual/en/ref.pcre.php

Preaper 03-06-2003 15:56

Oww op die manier :D Ja klopt.

Preaper 03-06-2003 18:37

Weet iemand wat er mis is met deze regel?
Code:

$line = preg_replace("/url=/(\"|'|)/http:\/\/.*/(\"|'| |)", " ", $line);
hij hoort dit te kunnen vinden:

<meta http-equiv="Refresh" content="0; surf.php?URL=http://willekeurigeurldievervangenmoetworden">

deathz0rz 03-06-2003 19:07

Citaat:

Preaper schreef op 03-06-2003 @ 19:37:
Weet iemand wat er mis is met deze regel?
Code:

$line = preg_replace("/url=/(\"|'|)/http:\/\/.*/(\"|'| |)", " ", $line);
hij hoort dit te kunnen vinden:

<meta http-equiv="Refresh" content="0; surf.php?URL=http://willekeurigeurldievervangenmoetworden">

je moet er \ voor en \i achter zetten (die \ is om perl een id te geven wat het eind is en die i is voor case-insensitive)

wat is de fout trouwens?

Preaper 03-06-2003 19:25

Nu heb ik:
$line = preg_replace("\ url=http:\/\/(\"|'| ||)(.*)(>|\"|')\i","url=/proxy/surf.php?url=http://$1hond$2", $line);

En krijg de melding:
Delimiter must not be alphanumeric or backslash

Preaper 03-06-2003 19:29

$line = preg_replace("/ url=http:\/\/(\"|'| ||)(.*)(>|\"|')/i","url=/proxy/surf.php?url=http://$1hond$2", $line);
Hierbij werkt het wel, maar het doet absoluut niet wat ik wil....
Ik wil dat hij zoekt naar een: "url=http://", daarachter mag " of '. Vervolgens komt er een url (deze moet dus vervangen worden), en daarachter moet een ", ' of > staan.

deathz0rz 03-06-2003 19:32

Citaat:

Preaper schreef op 03-06-2003 @ 20:29:
$line = preg_replace("/ url=http:\/\/(\"|'| ||)(.*)(>|\"|')/i","url=/proxy/surf.php?url=http://$1hond$2", $line);
Hierbij werkt het wel, maar het doet absoluut niet wat ik wil....
Ik wil dat hij zoekt naar een: "url=http://", daarachter mag " of '. Vervolgens komt er een url (deze moet dus vervangen worden), en daarachter moet een ", ' of > staan.

ik zou de pattern niet weten... ergens in 1 vd comments bij 1 vd functions op de PCRE-reference staat een goede uitleg...

Preaper 03-06-2003 19:34

Ok... dat wordt weer zoeken -_-'

Preaper 03-06-2003 20:42

*sigh* ik kom echt niet verder :(

deathz0rz 03-06-2003 20:48

Citaat:

Preaper schreef op 03-06-2003 @ 21:42:
*sigh* ik kom echt niet verder :(
probeer eerst eens wat anders met regexps, en dan daarna kijken of het wat beter lukt, of ga nu gamen en ga daarna verder, ontspanning kan geen kwaad

Preaper 03-06-2003 21:30

Ik denk dat laatste maar :o.


Alle tijden zijn GMT +1. Het is nu 00:34.

Powered by vBulletin® Version 3.8.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.