[php] regular expression probleempje

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
Ze zijn niet m'n grootste vrienden..ik blijf ze lastig vinden.

Doel: ik ben de code van een bestaand forum een beetje aan het hacken om net zoals hij bij GoT stukjes code wat overzichtelijker weer te kunnen geven. Ik dacht er in eerste instantie snel te zijn door gewoon <pre></pre> te gebruiken, maar toen ik het in mozilla (de nieuwe phoenix) bekeek bleek dat er niet uit te zien. Die hanteert en regelafstand van ca 2,5 regel. Evenzo in Opera, maar die maakt het zelfs nog erges door de tekst gewoon buiten m'n tabel te laten vallen waar het instaat...hoe die dat voor elkaar krijgt is mee ook een raadsel. Maargoed...ben nu dus bezig het verhaal maar met regular expressions op te lossen.

heb ff een test.php gemaakt en zit nu op dit punt:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
function pre($str)
{
    $str = str_replace(" ","&nbsp;",$str);
    $str = str_replace("\t","&nbsp;&nbsp;&nbsp;&nbsp;",$str);
    $str = nl2br($str);
    return $str;
}

$body="[ccode]bla\n 1\n  2\n\ttab\n[/ccode]";

$body=preg_replace("/\\[ccode\](.*)\\[\/ccode\]/i",pre("[ccode]$1[/ccode]"),$body);

echo $body;

Die [code] tags zet ik dan later nog wel om naar een tabel met witte achtergrond en een zwart randje. Maargoed, afgezien daarvan werkt dit dus niet. Hoe kan ik er nou voor zorgen dat die functie pre() alleen wordt toegepast op $1 (het gedeelte tussen de [ccode][/ccode]?

Acties:
  • 0 Henk 'm!

  • chem
  • Registratie: Oktober 2000
  • Laatst online: 11-09 11:19

chem

Reist de wereld rond

met \\1 ipv $1

Klaar voor een nieuwe uitdaging.


Acties:
  • 0 Henk 'm!

  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
eval modifier gebruiken:
PHP:
1
$body=preg_replace("/\\[ccode\](.*)\\[\/ccode\]/ie",'pre("$1")',$body);

edit:
zonder ccode om $1 lijkt me

[ Voor 53% gewijzigd door marcusk op 11-01-2003 23:37 ]


Acties:
  • 0 Henk 'm!

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
ik ben inmiddels achter 2 dingen gekomen:
1. Waarom het in eerste instantie niet goed ging, was omdat ie gewoon al niet matchte op het eerste argument
2. punt 1 komt omdat ie over z'n nek ging van die \n in de string. zodra ik die er uit haal matched ie er wel op en replaced ie eindelijk wat
3. hij replaced 'm nog steeds niet goed. dit is de code die ik nu in m'n test bestand heb:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function pre($str)
{
    $str = str_replace(" ","&nbsp;",$str);
    $str = str_replace("\t","&nbsp;&nbsp;&nbsp;&nbsp;",$str);
    $str = nl2br($str);
    echo "-> ".$str."<br>\n";
    return $str;
}

$body   ="[ccode]bla\t 1[/ccode]";

$new_body   = preg_replace(
                "/\\[ccode\](.*)\\[\/ccode\]/i",
                pre("\\1"),
                $body
                );

echo $new_body."<br><br>\n".$nb;
en geeft als output:
-> \1
bla 1

als ik in de source kijk is die \t nog gewoon een echte tab en niet 4 non-breaking-spaces zoals ik wil.

Dus ik zit er nu nog mee,
* hoe komt het dat ie van een \n over z'n nek gaat? dat moet toch gewoon kunnen?
* en hoe werkt dat nu precies met die functie. hij geeft het duidelijk niet goed door, want de functie krijgt gewoon \\1 en niet waar \\1 voor staat. maar er wordt verder ook nix mee gedaan. want $str, wat door de functie wordt gereturned, heeft als waarde \1, maar toch replaced de preg_replace $body door \\1 (de 'inhoud' van \\1 dus). kan het eigenljk wel, een functie binnen een preg_replace gebruiken?

Acties:
  • 0 Henk 'm!

  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
zoals ik al zei:
eval modifier gebruiken: [...]
en om het probleem met de newline op te lossen moet je de s modifier gebruiken.

Zie http://php.nederland.net/...cre.pattern.modifiers.php

Acties:
  • 0 Henk 'm!

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
sorry, weet ook niet waarom ik daar overheen heb gelezen
maar.....pfff...het wordt steeds vager

ik heb van /i /ie gemaakt en krijg dan de volgende error:
Parse error: parse error in /usr/local/slash/apache/vhosts/marty.excudo.net/httpdocs/forum/include/test.php(17) : regexp code on line 1

Fatal error: Failed evaluating code: bla 1 in /usr/local/slash/apache/vhosts/marty.excudo.net/httpdocs/forum/include/test.php on line 17

als ik echer van de \t \n maak (dus een newline ipv een tab) dan krijg ik de error niet.
die /e trekt het dus niet als er een \t in voor komt.
wat doe ik daar nu weer aan?

(ik heb gekeken tussen de modifiers, maar kon geen oplossing vinden)

Acties:
  • 0 Henk 'm!

Verwijderd

marty schreef op 12 January 2003 @ 00:49:
sorry, weet ook niet waarom ik daar overheen heb gelezen
maar.....pfff...het wordt steeds vager

ik heb van /i /ie gemaakt en krijg dan de volgende error:
Parse error: parse error in /usr/local/slash/apache/vhosts/marty.excudo.net/httpdocs/forum/include/test.php(17) : regexp code on line 1

Fatal error: Failed evaluating code: bla 1 in /usr/local/slash/apache/vhosts/marty.excudo.net/httpdocs/forum/include/test.php on line 17

als ik echer van de \t \n maak (dus een newline ipv een tab) dan krijg ik de error niet.
die /e trekt het dus niet als er een \t in voor komt.
wat doe ik daar nu weer aan?

(ik heb gekeken tussen de modifiers, maar kon geen oplossing vinden)
Als je "e" gebruikt moet je wel een php-statement als string meegeven, dus:

PHP:
1
preg_replace( "pattern", "doe_iets( '\\1' )", $var );


Anders krijg je dus idd zo'n errors ;)

Acties:
  • 0 Henk 'm!

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
Verwijderd schreef op 12 januari 2003 @ 00:56:
[...]


Als je "e" gebruikt moet je wel een php-statement als string meegeven, dus:

PHP:
1
preg_replace( "pattern", "doe_iets( '\\1' )", $var );


Anders krijg je dus idd zo'n errors ;)
Dat doe ik toch ook. ik voer de (handgemaakte) functie pre() uit.
daarbij, als ik \t in m'n string heb staan krijg ik de fout, als ik die vervang voor \n krijg ik geen fout. er gaat dus duidelijk wat anders mis

Acties:
  • 0 Henk 'm!

  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
dit werkt bij mij gewoon hoor:
PHP:
1
2
    $body = "[ccode]bla\n 1\n  2\n\ttab\n[/ccode]"; 
    print preg_replace("/\[ccode](.*)\\[\/ccode]/ies", 'pre("$1")', $body);

[ Voor 19% gewijzigd door marcusk op 12-01-2003 01:15 ]


Acties:
  • 0 Henk 'm!

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
hij liep bij mij ook op m'n \t stuk, niet de \n

maar ik heb het inmiddels gevonden. er moesten nog single quotes om de fucntie heen. Had al wel geprobeerd quotes er omheen te zetten (en had het gedeelte binnen in ge-single-quote), maar het moest dus net andersom


weer een probleem de wereld uit
mijn dank is groot.

Acties:
  • 0 Henk 'm!

Verwijderd

marty schreef op 12 januari 2003 @ 01:33:
hij liep bij mij ook op m'n \t stuk, niet de \n

maar ik heb het inmiddels gevonden. er moesten nog single quotes om de fucntie heen. Had al wel geprobeerd quotes er omheen te zetten (en had het gedeelte binnen in ge-single-quote), maar het moest dus net andersom


weer een probleem de wereld uit
mijn dank is groot.
Oops ... hier doet ie het iig wel zo.

[ Voor 16% gewijzigd door Verwijderd op 12-01-2003 11:41 ]

Pagina: 1