[PHP] Pattern vraag

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • TutanRamon
  • Registratie: Februari 2001
  • Laatst online: 08-09 19:53
Ik heb een stuk .HTML met daarin oa. allemaal URL (in de vorm van <A HREF="blaat.html">basdf</A>

Nu heb ik de volgende code gebruikt om deze eruit te filteren:

PHP:
1
2
$preg = '/<a[^>]+href\s*=\s*(?:"|\')?(http[^\s"\'>]*)[^>]*>([^<]*)<\/a>/is';   
preg_match_all($preg, $code, $matches);


Het werkt perfect maar het probleem is echter als volgt. In dit .html staan ook bepaalde urls die ik er niet in wil hebben. En dat zijn de URLS die een <FONT> tag tussen de <A HREF> </A> hebben. (<A HREF="test.html"><FONT COLOR=FFFFF> DEZE DUS</A>)

Die URLS wil ik niet hebben, alleen degene die geen font tag tussen de a href heeft moet ik hebben. Mijn vraag is als volgt. Kan je mbv van dit pattern gebeuren ook bepaalde zaken 'excluden'. Of die voorwaarde van $preg moet strenger?

[ Voor 14% gewijzigd door TutanRamon op 07-10-2003 13:15 ]

We see things as we are, not as they are


Acties:
  • 0 Henk 'm!

  • TutanRamon
  • Registratie: Februari 2001
  • Laatst online: 08-09 19:53
Ik denk dat ik al een oplossing weet. bij $preg erin verwerken dat er na de > (van <A HREF)
een [a..z][A..Z][0..0] moet komen en geen "<"

Maar hoe vewerk ik dat erin?

We see things as we are, not as they are


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Dit heb ik net even getest en het werkt wel:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php

$reg = "/<a\s*href\s*=\s*([\"\'])[^\"\']+\\1\s*>[^<>]+<\/a>/";

$subject = "<a href=\"blaat.htm\">abc</a>";

print preg_match($reg, $subject);

$subject2 = "<a href=\"blaat.htm\"><b>abc</b></a>";

print preg_match($reg, $subject2);

?>


Is dat wat je ongeveer bedoelde?

[ Voor 24% gewijzigd door Michali op 07-10-2003 12:22 ]

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • TutanRamon
  • Registratie: Februari 2001
  • Laatst online: 08-09 19:53
Michali schreef op 07 October 2003 @ 12:21:
Dit heb ik net even getest en het werkt wel:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php

$reg = "/<a\s*href\s*=\s*([\"\'])[^\"\']+\\1\s*>[^<>]+<\/a>/";

$subject = "<a href=\"blaat.htm\">abc</a>";

print preg_match($reg, $subject);

$subject2 = "<a href=\"blaat.htm\"><b>abc</b></a>";

print preg_match($reg, $subject2);

?>


Is dat wat je ongeveer bedoelde?
Ja, toppertje. Dat bedoelde ik. Alleen als ik nu preg_match_all doe, komt er een array uit, alleen ik snap niet zoveel van die inhoud van die array... Beetje wazig.

Op $matches[0][x] staat <a href="http://www.blaat.nl">abc</a>
Op $matches[1][x] stata ''

Terwijl ik dat abc op $matches[1][x] moet staan en http://www.blaat.nl op $matches[0][x]....Snap je?
:?

[ Voor 21% gewijzigd door TutanRamon op 07-10-2003 13:16 ]

We see things as we are, not as they are


Acties:
  • 0 Henk 'm!

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 10-08 02:59

Gerco

Professional Newbie

Je moet nog aangeven welke data je wilt hebben, dus iets in je regex tussen () zetten, probeer deze eens:
PHP:
1
$reg = "/<a\s*href\s*=\s*([\"\'])[^\"\']+\\1\s*>([^<>]+)<\/a>/"

[ Voor 35% gewijzigd door Gerco op 07-10-2003 13:23 ]

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


Acties:
  • 0 Henk 'm!

  • TutanRamon
  • Registratie: Februari 2001
  • Laatst online: 08-09 19:53
Gerco schreef op 07 October 2003 @ 13:17:
Je moet nog aangeven welke data je wilt hebben, dus iets in je regex tussen () zetten, probeer deze eens:
PHP:
1
/<a\s*href\s*=\s*([\"\'])[^\"\']+\\1\s*>([^<>]+)<\/a>/
Nee, die geeft helemaal geen resultaat.

[ Voor 13% gewijzigd door TutanRamon op 07-10-2003 13:20 ]

We see things as we are, not as they are


Acties:
  • 0 Henk 'm!

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 10-08 02:59

Gerco

Professional Newbie

TutanRamon schreef op 07 October 2003 @ 13:19:
Nee, die geeft helemaal geen resultaat.
Hmm, ik had niet gezien dat er al haakjes instonden... dan gaat wat ik zei natuurlijk niet op.

Probeer dit dan eens, ik weet niet of je in een regex haakjes mag nesten, maar daar kom je dan vanzelf wel achter.
PHP:
1
$reg = "/<a\s*href\s*=\s*(([\"\'])[^\"\']+\\1)\s*>[^<>]+<\/a>/"

[ Voor 30% gewijzigd door Gerco op 07-10-2003 13:27 ]

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


Acties:
  • 0 Henk 'm!

  • TutanRamon
  • Registratie: Februari 2001
  • Laatst online: 08-09 19:53
Gerco schreef op 07 October 2003 @ 13:25:
[...]

Hmm, ik had niet gezien dat er al haakjes instonden... dan gaat wat ik zei natuurlijk niet op.

Probeer dit dan eens, ik weet niet of je in een regex haakjes mag nesten, maar daar kom je dan vanzelf wel achter.
PHP:
1
$reg = "/<a\s*href\s*=\s*(([\"\'])[^\"\']+\\1)\s*>[^<>]+<\/a>/"
Nog steeds geen resultaat. En ja, je mag haakjes nesten in een regex. Tenminste, dat gebruikte ik eerst ook (bij mijn bovenste regex)

We see things as we are, not as they are


Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Kijk even naar de laatste parameter van preg_match_all en de PREG_SET_ORDER en PREG_MATCH_ORDER constanten.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Gerco schreef op 07 October 2003 @ 13:25:
[...]

Hmm, ik had niet gezien dat er al haakjes instonden... dan gaat wat ik zei natuurlijk niet op.

Probeer dit dan eens, ik weet niet of je in een regex haakjes mag nesten, maar daar kom je dan vanzelf wel achter.
PHP:
1
$reg = "/<a\s*href\s*=\s*(([\"\'])[^\"\']+\\1)\s*>[^<>]+<\/a>/"
die \\1 is een backreference naar de eerste quote. Die moet je er dus wel buiten laten.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?php

$reg = "/<a\s*href\s*=\s*([\"\'])([^\"\']+)\\1\s*>([^<>]+)<\/a>/";

$subject = "<a href=\"blaat.htm\">abc</a>";

preg_match_all($reg, $subject, $matches);

print_r($matches);

?>

/*
Array
(
    [0] => Array
        (
            [0] => <a href="blaat.htm">abc</a>
        )

    [1] => Array
        (
            [0] => "
        )

    [2] => Array
        (
            [0] => blaat.htm
        )

    [3] => Array
        (
            [0] => abc
        )
)
*/

Dit moet werken. :)

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Die backreference slaat trouwens nergens op. Volgens het stukje ([^\"\']+) moet er sowieso een dubbele of enkele quote komen op de plaats van de backreference, anders matcht de hele regex niet als er niet al gestart is met een quote

Ik neem aan dat dat je bedoeling is met die backreference, ook matchen op niet gequote href's.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz

Pagina: 1