Gå til innhold

[Løst]Hjelp til å forbedre en regex


Anbefalte innlegg

Jeg bruker denne regex'en til å finne linker i en html-kode:

$regexp = "<a\s[^>]*href=(\"??)([^\" >]*?)\\1[^>]*>(.*)<\/a>";

Denne fanger opp alle linker flott, men jeg vil snevre inn litt hvilke typer linker den henter. Det jeg vil er å finne kun linker som har en rel-tag, nærmere bestemt i denne formatet:

<a href="http://site.com/folder/id769182" rel="imagetooltip[media-someIDstuff.jpg]">Link name</a>

Informasjonen jeg henter ut er URLen, navnet på linken og inneholdet rel-taggen er ikke viktige. Eineste løsningen jeg har funnet ut er å filtrere linkene etter regexpen er kjørt, men hadde vært flott om de kunne taes før det.

Lenke til kommentar
Videoannonse
Annonse
Jeg bruker denne regex'en til å finne linker i en html-kode:

$regexp = "<a\s[^>]*href=(\"??)([^\" >]*?)\\1[^>]*>(.*)<\/a>";

Denne fanger opp alle linker flott, men jeg vil snevre inn litt hvilke typer linker den henter. Det jeg vil er å finne kun linker som har en rel-tag, nærmere bestemt i denne formatet:

<a href="http://site.com/folder/id769182" rel="imagetooltip[media-someIDstuff.jpg]">Link name</a>

Informasjonen jeg henter ut er URLen, navnet på linken og inneholdet rel-taggen er ikke viktige. Eineste løsningen jeg har funnet ut er å filtrere linkene etter regexpen er kjørt, men hadde vært flott om de kunne taes før det.

For å inkludere linker med rel før href etc, må det vel litt filtering til.

<?php
$text = <<< EOF
<a href="http://site.com/folder/id769182" rel="imagetooltip[media-someIDstuff.jpg]">Link name</a>
<a href="http://site.com/folder/id769184"  title="sdf" uhu="sdf"  rel="imagetooltip[media-someotherstuff.jpg]">Link two</a>
<a href="http://site.com/folder/id769186">Link
three</a>
<a rel="imagetooltip[media-someotherstuff.jpg]" title="sdf">Link four</a>
EOF;
$regex = '#<a\s+(?:(?:href="(?P<href>[^">]*)"\s*)|(?:rel="(?P<rel>[^">]*)"\s*)|(?:\w+="[^">]*"\s*))+\s*>(?P<text>.*?)</a>#smi';

if (preg_match_all($regex, $text, $matches)) {
$arr['rel'] = array_filter($matches['rel']);
$arr['href'] = array_intersect_key($matches['href'], $arr['rel']);
$arr['text'] = array_intersect_key($matches['text'], $arr['rel']);
print_r($arr);
} else {
echo "No matches\n";
}

 

Kanskje denne vil være til nytte og

function array_spreadsheet_flip(array $arr)
{
$out = array();
foreach ($arr as $k => $sub) {
	foreach ($sub as $sk => $val) {
		$out[$sk][$k] = $val;
	}
}
return $out;
}

Lenke til kommentar

Akkurat hva jeg trengte. Mer effektiv enn det jeg hadde laget selv og med mindre kode. Til og med lært noe har jeg og, takker og bukker :)

 

 

$regex = '#<a\s+(?:(?:href="(?P<href>[^">]*)"\s*)|(?:rel="(?P<rel>[^">]*)"\s*)|(?:\w+="[^">]*"\s*))+\s*>(?P<text>.*?)</a>#smi';

if (preg_match_all($regex, $text, $matches)) {
$arr['rel'] = array_filter($matches['rel']);
$arr['href'] = array_intersect_key($matches['href'], $arr['rel']);
$arr['text'] = array_intersect_key($matches['text'], $arr['rel']);
print_r($arr);
} else {
echo "No matches\n";
}

Endret av Nilladilla
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...