[php,regex] css class toevoegen aan link met "lees mij"

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Freemann
  • Registratie: Januari 2002
  • Niet online

Freemann

CO2 Warmtepomp + VentilatieWTW

Topicstarter
ik ben nu al een goede avond aan het zoeken en klooien met php en regex maar het lukt niet echt..

Wat ik heb is het volgende:
<A href="http://www.bla.nl/index.php?action=bla&bla=186">Lees meer »</A>
Wat ik wil is dat alleen links die de tekst "lees meer" of in dit geval:
code:
1
Lees&nbsp;meer&nbsp;&raquo;

bevatten
<A href="http://www.bla.nl/index.php?action=bla&bla=186" class="lees_meer">Lees meer »</A>

Ik weet dat "scriptrequest" niet worden beantwoord maar ik ben totaal de weg kwijt... Heb al zoveel met preg_match, preg_replace, etc.. gedaan dat ik zelf niet meer weet wat nu wel/niet de goede weg is.. Heb met een link grabber zitten klooien en daarmee kreeg ik wel al de links uit mijn pagina in een array maar hier kon ik verder niet mee. Het "probleem" is dat ik wel regexen kan vinden om url te matchen of te replacen maar niet die ook rekening houden met een "tekst" in de link tussen de open en sluit tag.

Het nog even het idee gehad om met str_replace() aan de gang te gaan maar dit denkt de lading niet omdat ik dan niet op "lees meer" kan controleren.

de str_replace die ik had gebruikt is(maar die kan zoals gezegd geen rekening houden met de "lees meer"):
PHP:
1
$data = str_replace("href=\"http://www.bla.nl/index.php?action=bla", " class=\"lees_meer\" href=\"http://www.bla.nl/index.php?action=bla",$data);

ik hoop dat iemand mij een richting kan geven of op weg kan/wil helpen.

[ Voor 26% gewijzigd door Freemann op 26-02-2009 07:52 . Reden: oeps ]

https://www.taltion.nl, https://www.trekhaakkoffer-huren.nl, https://www.fietsendrager-huren.nl, https://www.fietskar-huren.nl


Acties:
  • 0 Henk 'm!

  • Sihaya
  • Registratie: Juni 2001
  • Niet online

Sihaya

Pasfoto:

Ik denk dat je het beste gebruik kan maken van "back references" in dit geval. Weet niet of php dit ondersteunt, maar in Perl zou je het in ieder geval op de volgende manier doen:

Perl:
1
s/<a href(.+)>Lees meer<\/a>/<a href\1 class="bla">Lees meer<\/a>/


Waarbij die \1 dus de back reference is.

signature has expired


Acties:
  • 0 Henk 'm!

  • ari
  • Registratie: November 2007
  • Laatst online: 01-08 22:36

ari

Je wil dus van dit:
<a href="http://www.bla.nl/index.php?action=bla&bla=186">Lees&nbsp;meer&nbsp;&raquo;</a>

Naar dit:
<a href="http://www.bla.nl/index.php?action=bla&bla=186" class="lees_meer">Lees&nbsp;meer&nbsp;&raquo;</a>

Hint: de vetgedrukte tekst.

Acties:
  • 0 Henk 'm!

Verwijderd

Sihaya schreef op woensdag 25 februari 2009 @ 23:24:
Ik denk dat je het beste gebruik kan maken van "back references" in dit geval. Weet niet of php dit ondersteunt, maar in Perl zou je het in ieder geval op de volgende manier doen:

Perl:
1
s/<a href(.+)>Lees meer<\/a>/<a href\1 class="bla">Lees meer<\/a>/


Waarbij die \1 dus de back reference is.
is .+ niet een beetje te greedy? [^>]*

<a href([^>]*)>Lees[^<]*meer[^<]*<\/a>
hoe ver kom je hier mee?

[ Voor 6% gewijzigd door Verwijderd op 25-02-2009 23:33 ]


Acties:
  • 0 Henk 'm!

  • doeternietoe
  • Registratie: November 2004
  • Laatst online: 21:31
Ik tracht persoonlijk regular expressions zoveel mogelijk te vermijden, ik zou het dus anders oplossen:

Waarom doe je niet met strtr een string replacement?

Deze string:
code:
1
">Lees meer »</A>


Moet je dan dus omzetten in deze string:
code:
1
" class="lees_meer">Lees meer »</A>


PHP:
1
2
3
function addLeesmeerClass( $input ){
  return strtr( $input, array( '>Lees&nbsp;meer&nbsp;&raquo;</a>' => 'class="lees_meer">Lees&nbsp;meer&nbsp;&raquo;</a>' ) );
}


Of zie ik iets over het hoofd? :S

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Als je de hele <a href="...">....</a> te pakken hebt kun je ook gewoon href=" vervangen met class="someclass" href=" :P Dan ben je minder/niet afhankelijk van de tekst in de link.

[ Voor 18% gewijzigd door RobIII op 25-02-2009 23:57 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • ari
  • Registratie: November 2007
  • Laatst online: 01-08 22:36

ari

RobIII schreef op woensdag 25 februari 2009 @ 23:57:
Dan ben je minder/niet afhankelijk van de tekst in de link.
Dat was nou net wél de bedoeling. ;)

[ Voor 19% gewijzigd door ari op 26-02-2009 00:00 . Reden: Quote ging mis ]


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
ari schreef op woensdag 25 februari 2009 @ 23:59:
[...]

Dat was nou net wél de bedoeling. ;)
Ik doelde meer op 't feit dat als de regex de match al heeft gevonden dan is 't automatisch een "lees meer" link; als je de 'lees meer' ook nog eens hardcode in de functie die de class toevoegt moet je op 2 plekken de 'lees meer' wijzigen als je er 'lees verder' van wil maken. Met mijn methode hou je de 'lees meer' match enkel in de regex en is de class-toevoeg-functie-dinges dus niet meer afhankelijk van de feitelijke tekst in de link.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Freemann
  • Registratie: Januari 2002
  • Niet online

Freemann

CO2 Warmtepomp + VentilatieWTW

Topicstarter
ari schreef op woensdag 25 februari 2009 @ 23:26:
Je wil dus van dit:
<a href="http://www.bla.nl/index.php?action=bla&bla=186">Lees&nbsp;meer&nbsp;&raquo;</a>

Naar dit:
<a href="http://www.bla.nl/index.php?action=bla&bla=186" class="lees_meer">Lees&nbsp;meer&nbsp;&raquo;</a>

Hint: de vetgedrukte tekst.
pffff dat ik hier niet eerder aan gedacht heb.... ik ga dat is ff proberen.

maar ik ben nog steeds wel geïnteresseerd in zo'n regex kreng... daar mee ben ik iets flexibeler voor het geval de bron in de toekomst wijzigt.


heb nu een regex gevonden voor een url maar deze werkt dus niet met mijn "lees meer" links...
code:
1
2
3
4
5
6
7
8
9
"^
(?#Protocol)(?:(?:ht|f)tp(?:s?)\:\/\/|~/|/)?
(?#User:Pass)(?:\w+:\w+@)?
(?#Subdomains)(?:(?:[-\w]+\.)+
(?#TLDDomains)(?:net|[a-z]{2}))
(?#Port)(?::[\d]{1,5})?
(?#DIR)(?:(?:(?:/(?:[-\w~!$+|.,=]|%[a-f\d]{2})+)+|/)+|\?|#)?
(?#Query)(?:(?:\?(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)(?:&(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)*)*
(?#Anchor)(?:#(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)?$"

[ Voor 4% gewijzigd door Freemann op 26-02-2009 07:57 ]

https://www.taltion.nl, https://www.trekhaakkoffer-huren.nl, https://www.fietsendrager-huren.nl, https://www.fietskar-huren.nl


  • Cartman!
  • Registratie: April 2000
  • Niet online
Waarom wil je perse een regex gebruiken? Een simpele replace is veel sneller dan regexen.
Pagina: 1