Avatar billede sw_red_6 Nybegynder
02. august 2007 - 14:22 Der er 13 kommentarer og
1 løsning

Kan ikke få reg ex til at virke

Jeg har forsøgt mig med lidt regex og jeg kan også lave en simpel udgave som tjekker en streng for bestemte tegn..
^[A-Za-z0-9(),;.:?!´'^"%]*$
Problemet jeg har nu er at den samme regex skal udvides så den kan tjekke om der er bestemte html-tags i stregen og det har jeg ikke det store held med.

Det skal lige siges at det skal virke i PHP 4 med preg_match, hvis det på nogen måde har indflydelse på udformningen..
Avatar billede sw_red_6 Nybegynder
02. august 2007 - 14:46 #1
For at afklare en mulig misforståelse så vil jeg have en liste med tilladte tegn og html-tags som jeg kan tjekke en tekst-streng med..
Avatar billede nielle Nybegynder
02. august 2007 - 19:09 #2
Jeg vil anbefale at du ikke forsøger at leve een monster-stor regex som skal klare hele opgaven i et hug. I stedet bør du dele det op i en serie af tjek, enten med simple regex eller blot strpos/stripos.

Det kan muligvis lade sig gøre at lave det du ønsker i en regex, men resultatet bliver meget svært at vedligeholde.
Avatar billede sw_red_6 Nybegynder
03. august 2007 - 09:08 #3
stripos kan ikke bruges fordi det er PHP 4.3.11 og den findes først i PHP5 og strpos kan ikke finde en streng, kun et enkelt tegn i PHP før v5..

Jeg kan godt dele det op i flere tjek, men jeg skal stadig have lidt hjælp til at finde en simpel regex, som jeg kan udvide med ekstra tags hvis det bliver nødvendigt..
Avatar billede sw_red_6 Nybegynder
03. august 2007 - 09:20 #4
hmm jeg har selv forsøgt og er kommet frem til det her:
^<\/?(ul|p|br|li|strong|em)>
men den tillader også at der står <input> og det er ikke meningen.. nogen der kan forbedre den så den virker?
Avatar billede nielle Nybegynder
03. august 2007 - 11:35 #5
Positiv tjek:

if (preg_match(#</?(ul|p|br|li|strong|em)(\s+[^>]+)?>#i, ...))

Denne vil ikke i sig selv forbyde at f.eks. <input> *også* findes i strengen.

Negativ tjek:

Her lkan du jo blot smide en not på dit tjek:

if (!preg_match(#</?(input|undtagelse2|undt3|undt4|osv)(\s+[^>]+)?>#i, ...))

Alternativt kan du bruge "negative lookahead":

Grundformen:

^((?!regexp).*)$

- matcher en linje som ikke matcher det indre regexp-mønster.

Anvendt på din problemstilling, kunne det se sådan her ud:

^((?!</?(input|undtagelse2|undt3|undt4|osv)(\s+[^>]+)?>).)*$

Denne vil returnere false på en linje som f.eks. indeholder <input>.
Avatar billede sw_red_6 Nybegynder
03. august 2007 - 12:00 #6
den sidste du foreslår ser interessant ud, men hvis jeg skal til at skrive samtlige tags der ikke er tilladt ind i den liste bliver den voldsomt stor, så er det muligt at lave det så det er den forholdsvis korte liste med tags som er tilladte der skal skrives i den liste?
Avatar billede sw_red_6 Nybegynder
03. august 2007 - 12:33 #7
Jeg har forsøgt med det sidste forslag du kommer med, men kan ikke rigtig for det til at virke..

Den tester true uanset om der findes et <input> eller ej, hvad kan der være galt?

if(preg_match("#((?!</?(input|div|style|script|b|td)(\s+[^>]+)?>).)#"))
Avatar billede nielle Nybegynder
04. august 2007 - 07:48 #8
Du skal huske ankrene i hver ende af din streng ^ og $ - for ellers matcher den stort set hvad som helst. Du skal også huske det lille i hvis det skal være case-insesitivt. :^)
Avatar billede nielle Nybegynder
04. august 2007 - 08:01 #9
Du fortæller ikke rigtigt hvilken sammenhæng du skal bruge det i, men det lyder lidt som om at det kunne være en forum/tagwall/guestbook eller lignende, hvor visse HTML-tags er tilladte og resten er forbudte?

En populær måde at klare dette på er ved at bruge BB-koder (BB = Buletin Board):

Man tillader brugerne at skrive de tag de ønsker på formen [ul], [p], [br], osv. I samme omgang forbyder man at folk skriver noget på formen <abc> - selv f.eks. <ul> er forbudt. Man kan enten vælge at fjerne sådanne tags, eller man kan vælge blot at "neutralisere" dem: Dette gøres ved at man erstatter alle < med &lt; og alle > med &gt;. Til sidst erstatter man alle lovlige BB-koder med deres HTML-version: F.eks. laves [p] om til <p>.
Avatar billede sw_red_6 Nybegynder
06. august 2007 - 08:59 #10
hmm jeg har prøvet med den her:
^((?!</?(input|div|style|script|b|td)(\s+[^>]+)?>).)*$

Men jeg får en warning der siger:
Warning: preg_match(): Unknown modifier '>' in /var/www/DB/DEV_SYN/administrator/i_mathias.php on line 75

Hvor går det galt? og hvordan får jeg tilføjet det i ?

Du har ret i at det ville være bedre at bruge BB-Kode, men det er ikke til forum/tagwall/guestbook el. lign. men til at kontrollere at der ikke er "ulovlige" tegn og tags i input når folk bestiller tid og når der bliver oprettet en rapport..
Desuden skal det være en funktion som kan bruges i hele vores system og muligvis også i kommende systemer...
Avatar billede sw_red_6 Nybegynder
06. august 2007 - 11:12 #11
Jeg har kigget lidt på det og har fundet ud af at den ikke kan lide den her:
if(preg_match("^((?!</?(input|div|style|script|b|td)(\s+[^>]+)?>).)*$/i"))
Fordi den tror at ^ er start og slut tag til den RegEx og derfor kun kigger på:
((?!</?(input|div|style|script|b|td)(\s+[
hvilket er forkert..

Hvor er det lige jeg har misforstået det?
Avatar billede nielle Nybegynder
06. august 2007 - 21:06 #12
Prøv sådan:

if (preg_match("#^((?!</?(input|div|style|script|b|td)(\s+[^>]+)?>).)*$#i", $tekst))

Normalt ser man folk have en / i hver ende af mønsteret, men nogen gange kan det være en fordel at bruge et andet tegn, f.eks. # som ovenfor.
Avatar billede sw_red_6 Nybegynder
07. august 2007 - 09:43 #13
hmm det syntes jeg ellers jeg havde prøvet, men det virker nu..
Hvis du ligger et svar...
Avatar billede nielle Nybegynder
07. august 2007 - 10:04 #14
Svar :^)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester