Avatar billede mrplov Nybegynder
14. august 2006 - 12:04 Der er 27 kommentarer

regex med/uden anförselstegn

Hey Alle

Jeg bruger dette regex til at hente oplysninger om en href i et html dokument:
<a[\s]+[^>]*?href[\s]?=[\s\"\']+(.*?)[\"\']+.*?>([^<]+|.*?)?<\/a>

det fungerer ganske udemärket indtil at der ikke er anförselstegn omkring stien i a href tag'et, er der nogen
der kan modificere det så det også äder href's uden anförselstegn?


På forhånd tak.
Avatar billede nielle Nybegynder
14. august 2006 - 13:02 #1
Et bud:

<a[\s]+[^>]*?href[\s]?=\s+([\"\'])?(.*?)(?(1)\1|[ \t\n]).*?>([^<]+|.*?)?<\/a>
Avatar billede gizmo-gizmo Nybegynder
14. august 2006 - 13:22 #2
Et bud mere:

<a\s.*?href=[\'\"]?([^\'\"\s]*)[\'\"]?.*?>(.*?)<\/a>

$1 er href'en og $2 er linkteksten.
Avatar billede mrplov Nybegynder
15. august 2006 - 05:08 #3
Hey Gizmo

Jeg testede dit bud, og den fandt href'en, men den returnerede:
images/9.jpg><img
Er det muligt at justere udtrykket, så den ikke tager ><img med i href'en
så blir jeg rigtigt glad
Avatar billede gizmo-gizmo Nybegynder
15. august 2006 - 09:47 #4
ahh, ja. Fejlen opstår når man ikke benytter " og href'en er helt til højre i tagget, så vidste den ikke helt hvor den skulle stoppe. Hvad med:

<a\s.*?href=[\'\"]?([^\'\"\s>]*)[\'\"]?.*?>(.*?)<\/a>
Avatar billede nielle Nybegynder
15. august 2006 - 10:21 #5
Hmmm, jeg kunne da godt tænke mig noget respons på min? Den tager højde for situationen hvor der både er " eller ' eller intet.

I en simplere form ser den sådan her ud:

<a[^>]*href=(["'])?(.*?)(?(1)\1| ).*>([^<]*)</a>

- og hvis denne skal brug4es i f.eks. PHP, skal " og / escapes:

<a[^>]*href=([\"'])?(.*?)(?(1)\1| ).*>([^<]*)<\/a>

- sådan at de kan bruges i en preg_replace:

preg_replace("/<a[^>]*href=([\"'])?(.*?)(?(1)\1| ).*>([^<]*)<\/a>/i", "$1, $2, $3");
Avatar billede gizmo-gizmo Nybegynder
15. august 2006 - 13:14 #6
Nielle: Jeg kan ikke rigtigt få din til at virke (vha. preg_match i php med f.eks. <a href=test.html>test</a>)

Jeg tror ikke du kan få et ensartet resultat ved at bruge conditionals (hvor $1=href og $2=linktekst altid).
Avatar billede nielle Nybegynder
15. august 2006 - 16:19 #7
Denne her tager også højde doe tilfældet 15/08-2006 13:14:22

<a[^>]*href=(["'])?(.*?)(?(1)\1|(?: |>))(?:[^<>]*>)?([^<]+)</a>

- og i PHP bliver det til:

<a[^>]*href=([\"'])?(.*?)(?(1)\1|(?: |>))(?:[^<>]*>)?([^<]+)<\/a>

gizmo-gizmo> Jeg er ikke helt med på hvad du mener med et ensartet resultat?
Avatar billede gizmo-gizmo Nybegynder
15. august 2006 - 16:27 #8
Nielle:
Når jeg bruger udtrykket:
<a[^>]*href=([\"'])?(.*?)(?(1)\1|(?: |>))(?:[^<>]*>)?([^<]+)<\/a>
Mod:
<a href="test.html"><img src="test.gif"></a>

Så bliver:
$2="test.html"><img
$3=src="test.gif">

Der er et eller andet der går galt der.
Avatar billede nielle Nybegynder
15. august 2006 - 17:00 #9
Heldigvis let ar rette:

<a[^>]*href=(["'])?([^>]*?)(?(1)\1|(?: |>))(?:[^<>]*>)?(.*)</a>
Avatar billede nielle Nybegynder
15. august 2006 - 17:04 #10
Ahem, sådan:

<a[^>]*href=(["'])?([^>]*?)(?(1)\1|(?: |>))(?:[^<>]*>)?(.*?)</a>
Avatar billede gizmo-gizmo Nybegynder
15. august 2006 - 17:06 #11
Ahhh... så ser ud til at virke, bortset fra at href'en kommer til at indeholde " eller '. Dem skal man til at fjerne bagefter så?  Hvad med (.*) til sidst? er det en fejl?
Avatar billede gizmo-gizmo Nybegynder
15. august 2006 - 17:06 #12
ohhh ;)
Avatar billede nielle Nybegynder
15. august 2006 - 17:14 #13
> href'en kommer til at indeholde " eller '

Nej da.

Ok, jeg medgiver at løsningen 15/08-2006 17:04:31 ser noget mere kompliceret ud end 15/08-2006 13:14:22. Faktisk ser 15/08-2006 13:14:22 også ud til at løse det konkrete problem. :^)

Imidlertid vil jeg vove at påstå at 15/08-2006 17:04:31 er mere generel, og at denne også kan bruges på andre attributter end kun en href.
Avatar billede gizmo-gizmo Nybegynder
15. august 2006 - 17:25 #14
Det er efterhånden lidt derude hvor det måske bare var nemmere at lave 2 regex's til hvert tilfælde, men det er jo ikke særlig sejt :-)

Når jeg prøver din løsning 17:04:31 i php, så kommer href'en til at indeholde " eller '
Avatar billede nielle Nybegynder
15. august 2006 - 18:01 #15
Tja, desværre er det system jeg afprøver PHP på desværre nede lige i øjebliket, så jeg må ty til at lave det i C#. Men der får jeg altså ikke "- eller '-tegnene med i det matchede. Nu er det lidt svært (!) at argumentere imod hvad du ligefrem selv kan observere, men der er nu ingen som helst grund til at de skulle komme med.

Kan du ikke lige give nogle eksempler á la den form du gav dem på i 15/08-2006 16:27:48?
Avatar billede gizmo-gizmo Nybegynder
15. august 2006 - 18:43 #16
Nielle: Jeg har lige lagt en test op her så du kan se: http://forhandlerinfo.dk/725994.php

Ikke verdens største problem, men stadig lidt irriterende når den nu er så tæt på at være der.
Avatar billede nielle Nybegynder
15. august 2006 - 18:49 #17
Kan det tænkes at '-tegnet også bør escapes?

preg_match("/<a[^>]*href=([\"\'])?([^>]*?)(?(1)\1|(?: |>))(?:[^<>]*>)?(.*?)<\/a>/i", $str, $regs);

Umiddelbart ville jeg ikke mene at det gjorde nogen som helst foskel ... griber bare efter halmstrå. ;^)
Avatar billede nielle Nybegynder
15. august 2006 - 20:56 #18
gizmo-gizmo> Jeg kan set at du har escapet '-tegnet siden 15/08-2006 18:49:49, korrekt?

Underligt hvis hverken:

preg_match("/<a[^>]*href=([\"'])?([^>]*?)(?(1)\1|(?: |>))(?:[^<>]*>)?(.*?)<\/a>/i", $str, $regs);

- eller:

preg_match("/<a[^>]*href=([\"\'])?([^>]*?)(?(1)\1|(?: |>))(?:[^<>]*>)?(.*?)<\/a>/i", $str, $regs);

- kan håndtere et '-tegn rundt om href-værdien korrekt. For vi er vel enige om at [\"'] burde matche både " og '? Det går den ihvertfald i C# og det burde den altså også gøre i PHP.

Uanset, så er det det tætteste jeg kan komme på "den rigtige" løsning.
Avatar billede gizmo-gizmo Nybegynder
15. august 2006 - 21:16 #19
HAHA. Undskyld at jeg har været så vanskelig. Årsagen til at det går lidt galt i PHP er at den ikke kender \1 men det i stedet skal være \\1
Avatar billede nielle Nybegynder
15. august 2006 - 21:20 #20
Ahh, men så er det vel også nok med ' i stedet for \' ?
Avatar billede nielle Nybegynder
15. august 2006 - 21:21 #21
Altså:

preg_match("/<a[^>]*href=([\"'])?([^>]*?)(?(1)\\1|(?: |>))(?:[^<>]*>)?(.*?)<\/a>/i", $str, $regs);
Avatar billede gizmo-gizmo Nybegynder
15. august 2006 - 21:56 #22
Det er i princippet behøver ' ikke escapes.
Avatar billede gizmo-gizmo Nybegynder
15. august 2006 - 21:57 #23
(flyt selv rundt på bogstaverne så sætningen giver mening)
Avatar billede mrplov Nybegynder
16. august 2006 - 07:09 #24
geez - der var mange svar - undskyld jeg ikke har svaret, men jeg bor i en anden tidzone (thailand) derfor..
skal granske jeres bud
Avatar billede nielle Nybegynder
16. august 2006 - 07:36 #25
Der er mange indlæg og mange forbi'ere, men de to vigtigste er 15/08-2006 13:14:22 og 15/08-2006 21:21:36.

Du har ikke fortalt hvilket sprog du programmere i? Vi er af en eller anden grund gået ud fra PHP. Imidlertid er det en vigtig oplysning, for syntaksen og mulighederne variere faktisk med programmeringssproget.

"Eksperten.dk, nu også i Thailand!" Det må vist være Eksperten.th ;^)
Avatar billede nielle Nybegynder
22. august 2006 - 12:31 #26
Lukketid?
Avatar billede nielle Nybegynder
22. december 2007 - 20:05 #27
Lukketid?!
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