[php]preg_replace/for lus

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Geert.H
  • Registratie: Maart 2001
  • Laatst online: 14:37
edit:

onderaan dit topic staat hoever ik nu al ben...


Ok, dit is al mijn tweede topic vandaag over preg_replace. Hoewel het dit keer niet persé aan de preg hoeft te liggen. Ik heb aan een bepaalde lap tekst in een database met de volgende code
HTML:
1
2
3
bla bla bla<br>bla bla bla<br>
<a href='bijlage/di - chill out.pls' target='blank' id='bijlage'>bla bla blaat</a><br>
<a href='bijlage/175-7541_IMG.JPG' target='blank' id='bijlage'>bla bla blaat</a>

Nu wil de gebruiker deze tekst wijzigen, om dit te kunnen moet deze html worden omgezet naar:
code:
1
2
3
4
bla bla bla 
bla bla bla
[bijlage=10]bla bla blaat[/bijlage]
[bijlage=11]bla bla blaat[/bijlage]

Dit doe ik met behulp van het volgende script
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$bijlage_locatie = preg_replace("/(.*?)<a href=\'(.*?)\' target=\'blank\' id=\'bijlage\'>(.*?)<\/a>(.*?)/i","\\2, ", "$tekst");

$bijlage_array = preg_split("/,/", "$bijlage_locatie");
$bijlage_aantal = count($bijlage_array) -1;
if(isset($bijlage_locatie) && $bijlage_locatie != $tekst)
{
    for($i=0; $i<$bijlage_aantal; $i++)
    {
        $bijlage_locatie = $bijlage_array[$i];
        $bijlage_locatie = preg_quote($bijlage_locatie,'/');
             /* with special tnx to cheetah :p */
        $data_locatie = mysql_query("   SELECT bijlage_id
                                FROM bijlages
                                WHERE locatie = '$bijlage_locatie'
                                ")or die("<div id='error'>".mysql_error()."</div>");
                                                            
        list($bijlage_id) = mysql_fetch_array($data_locatie);
        $tekst = preg_replace("/\<a href=\'$bijlage_locatie\' target=\'blank\' id=\'bijlage\'>(.+?)<\/a>/i","[bijlage=$bijlage_id]\\1[/bijlage]", "$tekst");
    }
}


Dit zou(lijkt mij) gewoon moeten werken, maar dat doet het dus niet. Als ik de eerdergenoemde tekst door dit script heen haal, dan zal er dit uitkomen:
HTML:
1
2
3
4
[bijlage=11]bla bla blaat[/bijlage]

<a href='bijlage/175-7541_IMG.JPG' target='blank' id='bijlage'>bla bla blaat</a>
[/bijlage]

Oftewel, na de eerste kapt die ermee (nee, niet alleen bij de laatste, want als ik 10 bijlage's heb, doet die alleen de eerste en de rest niet).
Ook geeft hij alleen een bijlage_id bij de eerste bijlage, bij de rest haalt die niets meer op uit de database, hij krijgt 0 rows terug.
Als ik echter de bijlage_locatie bekijk in de for lus, dan is die wel anders voor elke situatie (dus bij de eerste is die bijlage/di - chill out.pls, en bij de tweede bijlage/175-7541_IMG.JPG)

Ik snap dus niet waarom die na de eerste keer stopt...

edit:
Nog ff wat ik allemaal heb gedaan:
- ipv
code:
1
2
...
$tekst = preg_replace("/\<a href=\'$bijlage_locatie\' target=\'blank\' id=\'bijlage\'>(.+?)<\/a>/i","[bijlage=$bijlage_id]\\1[/bijlage]", "$tekst");

code:
1
2
...
$tekst = preg_replace("/\<a href=\'(.*?)\' target=\'blank\' id=\'bijlage\'>(.+?)<\/a>/i","[bijlage=$bijlage_id]\\1[/bijlage]", "$tekst");

Dit zorgde ervoor dat in eens wel alle bijlages werden vervangen, maar ze kregen allemaal het id nummer van de eerste mee.

Het ligt niet aan de white space, andere gekke tekens oid.

[ Voor 71% gewijzigd door Geert.H op 30-05-2005 12:06 ]


Acties:
  • 0 Henk 'm!

  • Huppie
  • Registratie: Mei 2003
  • Laatst online: 02-09 09:59
Ligt het hier toevallig aan?
PHP:
18
      $tekst = preg_replace("/\<a href=\'$bijalge_locatie\' target=\'blank\' id=\'bijlage\'>(.+?)<\/a>/i","[bijlage=$bijlage_id]\\1[/bijlage]", "$tekst");

Probeer eens $bijlage_locatie ;)

edit:
Of is dat gewoon een fout in je post?


Het valt me btw ook op dat je die <a href= ... escaped? (backslash voor <a?)

edit:
Ok, laatste edit voor ik naar bed ga...ik moet beter lezen :P

Hopenlijk heb je hier wat meer aan als dat zinloos geblaat hierboven ;)

Je zegt aan het eind dat ze allemaal het id van de 1e mee kregen, als ik naar je script kijk klopt dat toch ook?
PHP:
1
$bijlage_locatie = preg_replace("/(.*?)<a href=\'(.*?)\' target=\'blank\' id=\'bijlage\'>(.*?)<\/a>(.*?)/i","\\2, ", "$tekst");

Je vraagt hier maar 1x een bijlage_locatie op. Zelf zou ik het zo proberen:
PHP:
1
2
3
4
5
while( preg_match( "/<a href=\'(.*?)\' target=\'blank\' id=\'bijlage\'>(.*?)<\/a>/i", $tekst, $stukjes) )
{
    $bijlage_locatie = $stukjes[2];
    ... voeg hier de rest van jouw code in ...
}


Nog even ter info:
Deze regex:
code:
1
(.*?)<a href=\'(.*?)\' target=\'blank\' id=\'bijlage\'>(.*?)<\/a>(.*?)
heb ik vervangen voor
code:
1
<a href=\'(.*?)\' target=\'blank\' id=\'bijlage\'>(.*?)<\/a>
omdat ie op jouw manier super-greedy was. Dit houd in dat het met die replace in 1x het hele stuk text pakt (deel 1 zou alles voor de 1e '<a href=' zijn, deel 2 braaf de locatie van de 1e bijlage en deel3 zou de rest van de tekst matchen en dus ook alle andere '<a href=' meenemen :)

En nu naar bed...eindelijk :z

[ Voor 150% gewijzigd door Huppie op 30-05-2005 01:27 ]

Proud member of TCF - D2OL is zooooo 2005


Acties:
  • 0 Henk 'm!

  • Geert.H
  • Registratie: Maart 2001
  • Laatst online: 14:37
Ok, het eerste foutje is inderdaad een fout in mijn post :) zal het even veranderen.
code:
1
2
3
<?
$bijlage_locatie = preg_replace("/(.*?)<a href=\'(.*?)\' target=\'blank\' id=\'bijlage\'>(.*?)<\/a>(.*?)/i","\\2, ", "$tekst");
?>

Ik dacht inderdaad eerst ook dat hier de fout lag, en dat was eerst ook een fout, maar die heb ik op (zoals ik hetzelf dan maar noem) een creatieve wijze opgelost. Zoals je ziet vervang ik alles door \\2, wat ik vervolgens krijg is:
PHP:
1
2
$bijlage_locatie = locatie 11, locatie 12, locatie 13,
$bijlage_array = preg_split("/,/", "$bijlage_locatie");

en dan heb ik de volgende array:
code:
1
2
3
4
[0]=>locatie 11
[1]=>locatie 12
[2]=>locatie 13
[3]=>

(zoals je ziet is de laatste leeg, daarom ook de -1 achter de count, ik weet het, niet zo'n nette manier :p) En deze array roep ik in de for lus weer aan.
edit:

Dit heb ik getest door de bijlage_array[$i] te echoën, en dit gaf elke keer een andere locatie.


En nog even over je wijziging aan de regex, ik weet dat die zo 'super-greedy' is, maar dat heb ik expres zo gedaan want hij werkt niet goed genoeg zonder die extra (.*?). Want stel dat een gebruiker besluit om in een nieuwsbericht alleen een bijlage toe te voegen en voor de rest niets, dan snapte die het niet en werkte er niets.
Ik heb hem ook veranderd, dat foutje stamde nog uit een ander verleden :+

Ow, en die escape bij de \<a is er waarschijnlijk in geslopen bij het uitzoeken waar de fout lag :p maar maakt voor de werking van de functie verder niet uit (dacht ik).

[ Voor 27% gewijzigd door Geert.H op 30-05-2005 11:15 ]


Acties:
  • 0 Henk 'm!

  • Geert.H
  • Registratie: Maart 2001
  • Laatst online: 14:37
:+ ik weet alweer waarom ik die regex zo had gemaakt. Want als ik dat er niet bij heb staan dan laat die de rest van de tekst staan, ik krijg dan dus:
code:
1
2
3
4
bla bla bla bla bla bla
locatie 11 bla bla bla
locatie 12
bla bla bla bla

ipv
code:
1
2
locatie 11
locatie 12


edit:

hmpf... ik begin nu toch al aardig gefrustreerd te raken door dit stomme ding...|:(
Volgens mij ligt het aan het feit dat de for lus er geen zin in heeft om een oude var te vervangen door een nieuwe. Dus ipv van dat die $data_locatie vernieuwt met de nieuwe locatie, stopt die er gewoon mee.

edit II:

toch leuk dat ik de hele tijd in mijn eigen topic kan reageren :+
Maar ik ben weer een stapje verder, ik ben erachter gekomen dat bij:
code:
1
$bijlage_locatie = preg_replace("/(.*?)<a href=\'(.*?)\' target=\'blank\' id=\'bijlage\'>(.*?)<\/a>(.*?)/i","\\2, ", "$tekst");

de string bijlage locatie NIET uit
code:
1
locatie11,locatie12,locatie13

bestaat, maar uit:
code:
1
locatie11, locatie12, locatie13
(white space)

En dit zie ik ook weer terug in de $bijlage_locatie
bij de eerste krijg ik $bijlage_locatie = "locatie 11", maar bij de tweede is dat " locatie 12". En dat is volgens mij de fout (want daardoor werkt de query ook niet). Ok, waarom dan weer dit gezeik hier...
Omdat ik die white space er niet uit kan halen. Ik heb het geprobeerd met:
code:
1
$bijlage_locatie = preg_replace("/(.*?), (.*?)/i","\\1,\\2", "$tekst");

en:
code:
1
$bijlage_array = preg_split("/,  /", "$bijlage_locatie");

Maar dat werkt niet, ik kan die white space er niet uit krijgen |:(
Trouwens, in de db staat wel gewoon <a href="locatie" .... en niet <a href=" locatie"

Iemand nog heldere ideeën hoe dit op te lossen?

[ Voor 103% gewijzigd door Geert.H op 30-05-2005 12:03 ]


Acties:
  • 0 Henk 'm!

  • Huppie
  • Registratie: Mei 2003
  • Laatst online: 02-09 09:59
Ik denk dat ik je fout gevonden heb.

Je voert je preg_quote iets te vroeg uit:
PHP:
10
11
12
13
14
15
16
17
18
        $bijlage_locatie = preg_quote($bijlage_locatie,'/');
              /* with special tnx to cheetah :p */
        $data_locatie = mysql_query("    SELECT bijlage_id
                                FROM bijlages
                                WHERE locatie = '$bijlage_locatie'
                                ")or die("<div id='error'>".mysql_error()."</div>");
                                                            
        list($bijlage_id) = mysql_fetch_array($data_locatie);
        $tekst = preg_replace("/\<a href=\'$bijlage_locatie\' target=\'blank\' id=\'bijlage\'>(.+?)<\/a>/i","[bijlage=$bijlage_id]\\1[/bijlage]", "$tekst");
Hier vraagt ie volgens mij al een onbestaande locatie op (je zegt nml WHERE locatie='$preg_quoted_versie_van_bijlage_locatie' ).

Misschien moet je het zo proberen:
PHP:
10
11
12
13
14
15
16
17
18
        $data_locatie = mysql_query("    SELECT bijlage_id
                                FROM bijlages
                                WHERE locatie = '$bijlage_locatie'
                                ")or die("<div id='error'>".mysql_error()."</div>");
                                                            
        list($bijlage_id) = mysql_fetch_array($data_locatie);
        $bijlage_locatie = preg_quote($bijlage_locatie,'/');
              /* with special tnx to cheetah :p */
        $tekst = preg_replace("/\<a href=\'$bijlage_locatie\' target=\'blank\' id=\'bijlage\'>(.+?)<\/a>/i","[bijlage=$bijlage_id]\\1[/bijlage]", "$tekst");


edit:
Met de trim() functie kan je whitespace aan het begin en einde van een string weghalen.
Trimmen doe je zo:

PHP:
1
$bijlage_locatie = trim($bijlage_locatie);

[ Voor 30% gewijzigd door Huppie op 30-05-2005 12:08 ]

Proud member of TCF - D2OL is zooooo 2005


Acties:
  • 0 Henk 'm!

  • Geert.H
  • Registratie: Maart 2001
  • Laatst online: 14:37
huppie...
ik hou van je _/-\o_
het werkt :)
Het lag dus aan de white space :)

[ Voor 9% gewijzigd door Geert.H op 30-05-2005 12:20 ]

Pagina: 1