02. august 2007 - 14:22Der 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..
I dette særtema om aspekter af AI ser vi på skiftet fra sprogmodeller til AI-agenter, og hvordan virksomheder kan navigere i spændet mellem teknologisk hastighed og behovet for menneskelig kontrol.
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.
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..
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?
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?
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. :^)
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 < og alle > med >. Til sidst erstatter man alle lovlige BB-koder med deres HTML-version: F.eks. laves [p] om til <p>.
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...
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..
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.