PHP replace - uitgebreid...

Pagina: 1
Acties:
  • 182 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Weet iemand een oplossing om het volgende:

<li>songtitel</li>

te vervangen door:

<li><a href="mp3info.php?titel=songtitel">songtitel</a></li>

De moeilijkheid (voor mij dan) zit 'm in het 2x gebruiken van de gevonden string tussen de <li></li> tags.

Acties:
  • 0 Henk 'm!

  • Peter
  • Registratie: Januari 2005
  • Laatst online: 13-09 17:10
PHP:
1
$tekst = preg_replace( '/<li>(.+)<\/li>/i', '<li><a href="mp3info.php?titel=\\1">\\1</a></li>', $tekst );


zoiets? :)

Acties:
  • 0 Henk 'm!

  • kmf
  • Registratie: November 2000
  • Niet online

kmf

regular expressions.

One thing's certain: the iPad seriously increases toilet time.. tibber uitnodigingscode: bqufpqmp


Acties:
  • 0 Henk 'm!

  • Pyrus
  • Registratie: November 2001
  • Laatst online: 21:57

Pyrus

Hardknock life

Hiervoor kun je prima regular expressions gebruiken. Of als dat echt te moeilijk is zou je met een extra variabele kunnen werken waar je alleen de tekst tussen de tags in stopt (wat je eigenlijk ook met een regex doet).

Regex zou zoiets worden ofzo:
PHP:
1
preg_replace("#<li>(.*)</li>#", "<li><a href=\"mp3info.php?titel=${1}\">${1}</a></li>", $input);


En op de andere manier:
PHP:
1
2
$titel=substr($item,4,-5);
print '<li><a href="mp3info.php?titel='.$titel.'">'.$titel.'</a></li>';


En nu ik er nog eens over na denk is die tweede methode beter, aangezien die sneller is. Dit werkt overigens alleen als je telkens echt alleen "<li>songtitel</li>" hebt en aan wilt passen naar die link. Heb je een grotere lap met tekst waar je het in wilt doen, dan zul je regexes moeten gebruiken.

[ Voor 13% gewijzigd door Pyrus op 18-01-2008 22:59 ]

LinkedIn


Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
Liever geen regexen maar manier II van Pyrus inderdaad. Is sneller en beter. Want de gouden regel:

"Do Not... DO NOT! Parse Html With Regex's" (bijv. http://kore-nordmann.de/blog/do_NOT_parse_using_regexp.html) :)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Thanks mensen voor de tips!
Toch ben ik bang dat ik de regex moet gaan gebruiken, aangezien ik de tekst wil scannen op songtitels, welke altijd tussen <li> tags staan. Deze moeten vervolgens een popup openen met info over die song + mp3 sample e.d.

Als ik

preg_replace("#<li>(.*)</li>#", "<li><a href=\"mp3info.php?titel=${1}\">${1}</a></li>", $input);

gebruik, krijg ik als output:

1. 1.

Terwijl er eerst stond:

1.(opening sequence)
2.(intro)
3.Seasons Change
4.Why'd You Lie To Me
5.Sick And Tired

Het kwartje voor het juiste gebruik van regex is bij mij nog niet gevallen... Ben me blind aan 't staren op www.php.net ;-)

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
#<li>(.*)</li># gaat natuurlijk zoveel mogelijk proberen te matchen: op de plaats van .* komt alles tussen je eerste <li> en je laatste </li>. Dat kun je verhelpen door de regex ungreedy te maken.
PHP:
1
2
$str = '<li>1. asdf</li><li>2. ghjkl</li><li>3. zxcv</li>';
echo preg_replace("#<li>(.*)</li>#U", "<li><a href=\"mp3info.php?titel=\\1\">\\1</a></li>", $str);

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Dit gaat natuurlijk fout bij de bijzondere tekens, zo zonder iets als urlencode/html_entity_decode.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02 23:12

SchizoDuckie

Kwaak

of fix het aan de clientside :P

HTML:
1
2
3
4
5
6
7
<script src='mootools.js'></script>
<script type='text/javascript'>

$$('LI').each(function(el){ 
  el.adopt(new Element('A', {href: 'mp3info.php?titel='+el.getText() }).setText(el.getText()));
}
</script>

ofziets :P maar da's net waar je het wil doen :))

Stop uploading passwords to Github!


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Glowmouse, ik heb jouw oplossing gebruikt, met de 'ungreedy' mark. Werkt perfect nu!
SchizoDuckie, ook jij bedankt voor je link naar mootools :-) Je oplossing (ook met het benodigde extra ')' op regel 4) kreeg ik nog niet aan de praat, maar ik vond voldoende andere leuke tools om m'n site wat flitsender te maken!

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Het is niet echt nodig om hier ungreedy te gebruiken. Daardoor pak je alleen ook matches met tags tussen <li> en </li> mee. En je hebt natuurlijk de vreemde tekens nog. Dus ik denk aan iets als:
PHP:
1
2
3
4
5
6
7
8
9
10
11
<?php
$str = '<li>1. as & df</li><li>2. ghjkl "b"</li><li>3. zxcv</li>';
echo preg_replace_callback(
    "#<li>([^<]+)</li>#",
    create_function(
        '$matches',
        'return "<li><a href=\\"mp3info.php?titel="'.
        '.urlencode(html_entity_decode($matches[1]))'.
        '."\\">$matches[1]</a></li>";'),
    $str);
?>

Dit werkt enkel niet goed bij rariteiten als:
HTML:
1
<li><br test="<li>">onzin</li>

of
HTML:
1
<!-- <li>comments mogen niet veranderd worden</li> -->

Maar dat komt in de praktijk toch niet voor.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • mux
  • Registratie: Januari 2007
  • Laatst online: 18-09 16:37

mux

99% efficient!

mithras schreef op vrijdag 18 januari 2008 @ 23:00:
Liever geen regexen maar manier II van Pyrus inderdaad. Is sneller en beter. Want de gouden regel:

"Do Not... DO NOT! Parse Html With Regex's" (bijv. http://kore-nordmann.de/blog/do_NOT_parse_using_regexp.html) :)
Ik wil nog even de nadruk leggen op deze link - het is erg goed leesmateriaal (en roept een hoop interessante vragen en ander leesmateriaal op voor mij, gezien ik geen universitaire computerwetenschappen heb gedaan)
Pagina: 1