[php] Regular expression, gematchede tekst gebruiken

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • r0bert
  • Registratie: September 2001
  • Laatst online: 30-07 02:32
Topic gaat eigenlijk alleen om het opstellen van een regular expression. Ik weet niet hoe ik moet beginnen, laat staan hoe het eruit moet komen te zien. Als voorbeeld gebruik ik een tekst met daarin ergens een "functie", tenminste het staat geschreven als een functie maar is gewoon tekst, die vervangen moet worden door een aantal andere teksten:

vb van tekst
code:
1
voorbeelden hiervan zijn opsomming("vbscript","javascript")


dan moet opsomming("vbscript","javascript") vervangen worden door:
HTML:
1
2
   <dt>vbscript</dt>
   <dt>javascript</dt>

Dus er moet tekst/html ingevoegd worden. De argumenten genoemd in opsomming moeten daarin gebruikt worden.

[ Voor 8% gewijzigd door r0bert op 12-05-2004 20:24 ]


Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Ikke nie snappe, vbscript, javascript zijn losse strings die in een array zitten??? Kijk dan eens naar $var= "<dt>" . $var . "</dt>"

Of zijn het strings die in een tekst zitten??? Kijk dan eens naar eregi.

Acties:
  • 0 Henk 'm!

  • r0bert
  • Registratie: September 2001
  • Laatst online: 30-07 02:32
beschouw dit gewoon als 1 string
code:
1
$string = 'voorbeelden hiervan zijn opsomming("vbscript","javascript")';

zeg maar..

En het zal dus in de buurt van ereg/preg zitten.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

opsomming(\"[^\"]+\",)*(\"[^\"]+\",)

Dat is je expressie denk ik. Kijk ook eens in de FAQ, en op PHP.net in de preg_replace manual.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Domokoen
  • Registratie: Januari 2003
  • Laatst online: 06-09 22:53
Als het je alleen om de reguliere expressie gaat, zou je dan niet een tutorial zoeken?
Meestal kan dit met search/replace:
Search: vbscript|javascript
Replace with: <dt>\0</dt> (ookwel bekend als back-reference)

maar hoe je dat niet case sensitive doet mag je zelf uitzoeken, evenals welke functie in PHP dit is.

Acties:
  • 0 Henk 'm!

  • r0bert
  • Registratie: September 2001
  • Laatst online: 30-07 02:32
Ik ben volgens mij echt dyslectisch voor reguliere expressies :S :P Ik klooi nog wel wat aan..

edit:
thnx TheDark
code:
1
opsomming(\"[^\"]+\",)*(\"[^\"]+\",)
Doet de truc hier niet.. nog niet, helaas..

[ Voor 193% gewijzigd door r0bert op 12-05-2004 20:47 ]


Acties:
  • 0 Henk 'm!

  • MichelVH
  • Registratie: Oktober 2001
  • Laatst online: 16-09 20:54
PHP:
1
preg_replace("#opsomming(\"[^\"]+\",)*(\"[^\"]+\",)#", $strSubject, $arrResult);
Of de expression verder goed is heb ik niet naar gekeken, maar je moet natuurlijk wel een geldige delimiter erom heen zetten :)

[ Voor 99% gewijzigd door MichelVH op 12-05-2004 20:46 ]

Don't be afraid of the dark, be afraid of what it hides


Acties:
  • 0 Henk 'm!

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:38

preg_match("!\bopsomming\(\"[^)]*\")!i",$string,$matches);
$woorden = explode('","',$matches[1]);
for ($i = 0; $i < count($woorden); $i++)
{
if ($i == 1)
{
echo '<dl><dt>Opsomming</dt>'."\n";
}
echo '<dd>'.$woorden[$i].'</dd>'."\n";
if ($i == count($woorden))
{
echo '</dl>'."\n";
}
}

Wel ff een definition list <dl> item gebruiken hè! Goede code

[ Voor 130% gewijzigd door Skaah op 12-05-2004 21:04 ]


Acties:
  • 0 Henk 'm!

  • r0bert
  • Registratie: September 2001
  • Laatst online: 30-07 02:32
Ik krijg deze:
code:
1
Warning: Compilation failed: unmatched parentheses at offset 20
Wat het betekend :? Maar het werkt niet.. En ja, DL wel gebruiken, maar die kan ik er al gewoon boven echo-en

dus
code:
1
2
3
echo dl
for-lus, dd's
echo /dl


edit:
zo krijg ik geen foutmelding:
code:
1
"!\bopsomming\(\"[^\)]*\"\)!i"

Maar ook geen resultaat :(

[ Voor 19% gewijzigd door r0bert op 12-05-2004 20:57 ]


Acties:
  • 0 Henk 'm!

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:38
Pardon, dit is 'm.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<pre><?php

$string = 'voorbeelden hiervan zijn opsomming("vbscript","javascript")';

preg_match("!\bopsomming\(\"([^)]*)\"\)!i",$string,$matches);

print_r($matches);

$woorden = explode('","',$matches[1]);
for ($i = 0; $i < count($woorden); $i++)
{
  if (!$i)
  {
    echo '<dl><dt>Opsomming</dt>'."\n";
  }
  echo '<dd>'.$woorden[$i].'</dd>'."\n";
  if ($i+1 == count($woorden))
  {
    echo '</dl>'."\n";
  }
}
?>

Output:
code:
1
2
3
4
5
6
7
8
9
<pre>Array
(
    [0] => opsomming("vbscript","javascript")
    [1] => vbscript","javascript
)
<dl><dt>Opsomming</dt>
<dd>vbscript</dd>
<dd>javascript</dd>
</dl>

[ Voor 90% gewijzigd door Skaah op 12-05-2004 21:03 ]


Acties:
  • 0 Henk 'm!

  • r0bert
  • Registratie: September 2001
  • Laatst online: 30-07 02:32
Ik heb nu dit:
code:
1
2
$templResult = LoadFile($templFile);
$arrTemp     = preg_match("!\bopsomming\(\"([^)]*)\"\)!i", $templResult, $arrMatches);


Maar dit werkt niet! Als ik gewoon een string handmatig vul genaamd $templResult (zelfde waarde), maar als ik een bestand inlaad werkt het niet (de inhoud van het bestand wordt echt geladen in $templResult, want dat heb ik ge-echo-ed).. wat kan er nou fout zijn?

[ Voor 8% gewijzigd door r0bert op 15-05-2004 11:12 ]


Acties:
  • 0 Henk 'm!

  • r0bert
  • Registratie: September 2001
  • Laatst online: 30-07 02:32
*kleine kick*

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

r0bert schreef op 15 mei 2004 @ 11:10:
Ik heb nu dit:
code:
1
2
$templResult = LoadFile($templFile);
$arrTemp     = preg_match("!\bopsomming\(\"([^)]*)\"\)!i", $templResult, $arrMatches);


Maar dit werkt niet! Als ik gewoon een string handmatig vul genaamd $templResult (zelfde waarde), maar als ik een bestand inlaad werkt het niet (de inhoud van het bestand wordt echt geladen in $templResult, want dat heb ik ge-echo-ed).. wat kan er nou fout zijn?
Ehm, LoadFile is geen standaardfunctie van PHP, dus dat werkt sowieso niet, tenzij het een zelfgeschreven functie is, wat weer betekent dat je ons die functie moet laten zien als we je moeten helpen. :)

Als je een standaardfunctie van PHP zoekt dan bedoel je waarschijnlijk readfile() maar die schrijft direct naar de output buffer. Probeer de volgende hoofdstukken van de manual maar eens:
file() voor het in één keer inlezen in een array

file_get_contents() voor het in één keer inlezen in een string

fopen()
fread() deze twee samen voor handmatig inlezen

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • r0bert
  • Registratie: September 2001
  • Laatst online: 30-07 02:32
ok, mijn functie om de file in te lezen:
PHP:
1
2
3
4
5
6
7
8
9
/* Functie om bestand in te lezen .. */
function LoadFile($fileRef)
{
    $fileHandler    = @fopen($fileRef, 'r');
    $fileContent    = @fread($fileHandler, filesize($fileRef));
    @fclose($fileHandler);
    
    return $fileContent;
}

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

r0bert schreef op 16 mei 2004 @ 17:33:
ok, mijn functie om de file in te lezen:
PHP:
1
2
3
4
5
6
7
8
9
/* Functie om bestand in te lezen .. */
function LoadFile($fileRef)
{
    $fileHandler    = @fopen($fileRef, 'r');
    $fileContent    = @fread($fileHandler, filesize($fileRef));
    @fclose($fileHandler);
    
    return $fileContent;
}
Ok, dat is het probleem niet. Ik weet niet waar het dan wel zit.

Maar overal een @ voor zetten is wel gigantisch vies. Misschien is het een idee om fouten af te handelen in plaats van ze dmv @ te negeren?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Je moet het @ teken gewoon compleet vermijden, maak een eigen class die de foutafhandeling regelt.

Zet de error_reporting op 0

Volgens mij is er ergens in de PHP documentatie zelfs nog informatie te vinden over het maken van een eigen foutafhandeling mechanisme.

Acties:
  • 0 Henk 'm!

  • r0bert
  • Registratie: September 2001
  • Laatst online: 30-07 02:32
Ja, geloof dat dat waar is, maar is hier niet zo sterk van belang omdat het slechts om 1 paginaatje gaat.. Maar niemand weet dus een oplossing voor mijn probleem?

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

r0bert schreef op 16 mei 2004 @ 21:56:
Ja, geloof dat dat waar is, maar is hier niet zo sterk van belang omdat het slechts om 1 paginaatje gaat.. Maar niemand weet dus een oplossing voor mijn probleem?
Niet als hij bij de ene string wel werkt en bij de andere niet... Dat klinkt wel heel erg vaag namelijk.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • r0bert
  • Registratie: September 2001
  • Laatst online: 30-07 02:32
Ja, dat is dus ook het probleem :) Want als ik na LoadFile $templResult echo doet hij het gewoon prima..

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

offtopic:
Je zou ook gewoon kunnen besluiten file_get_contents() te gebruiken :P

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Ik betwijfel dat dit het oplost, maar probeer dit eens?
PHP:
1
2
$templResult = LoadFile($templFile);
$arrTemp     = preg_match("!\bopsomming\(\"([^\)]*)\"\)!i", $templResult, $arrMatches);

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

NMe84 schreef op 17 mei 2004 @ 11:55:
Ik betwijfel dat dit het oplost, maar probeer dit eens?
PHP:
1
2
$templResult = LoadFile($templFile);
$arrTemp     = preg_match("!\bopsomming\(\"([^\)]*)\"\)!i", $templResult, $arrMatches);
uhm, volgens mij wil hij de het stukkie (opsomming(blabla)) vervangen hebben in de text, dus de matches eruit halen heeft dan vrijwel geen nut. Zover ik weet is het ook niet met een gewone preg_replace te doen omdat in een match weer meerdere results zitten (de dingen die tussen <dt> moeten komen).
daarom zou een preg_replace_callback de beste oplossing zijn

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
function callback_preg($matches)
{
    $text="<dl><dt>Opsomming</dt>\n";
    $woorden = explode('","',$matches[1]);
    for ($i = 0; $i < count($woorden); $i++)
      $text.="<dd>$woorden[$i]</dd>\n";
    $text.= "</dl>\n";
    return $text;
}

$string='voorbeelden hiervan zijn opsomming("vbscript","javascript")';
$string=preg_replace_callback("!\bopsomming\(\"([^)]*)\"\)!i","callback_preg",$string);


hier is mijn versie (getest), een beetje geoptimaliseerd :)

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Mja, ik vind het eigenlijk een oplossing in de orde "Plakband" :+

Ik zou eerder zorgen dat de quotes ook daadwerkelijk functioneren als quotes en niet als iets "wat er gewoon leuk uitziet", zodat je ook gewoon haakjes en escape sequences kan gebruiken in de strings.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Verwijderd schreef op 17 mei 2004 @ 13:52:
uhm, volgens mij wil hij de het stukkie (opsomming(blabla)) vervangen hebben in de text, dus de matches eruit halen heeft dan vrijwel geen nut.
Ik heb gewoon zijn code gecopy-paste en daar een foutje uit gehaald. Hij had zijn code in principe namelijk al werkend, dus why change a winning team? :+
Verwijderd schreef op 17 mei 2004 @ 13:52:
Zover ik weet is het ook niet met een gewone preg_replace te doen omdat in een match weer meerdere results zitten (de dingen die tussen <dt> moeten komen).
daarom zou een preg_replace_callback de beste oplossing zijn

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
function callback_preg($matches)
{
    $text="<dl><dt>Opsomming</dt>\n";
    $woorden = explode('","',$matches[1]);
    for ($i = 0; $i < count($woorden); $i++)
      $text.="<dd>$woorden[$i]</dd>\n";
    $text.= "</dl>\n";
    return $text;
}

$string='voorbeelden hiervan zijn opsomming("vbscript","javascript")';
$string=preg_replace_callback("!\bopsomming\(\"([^)]*)\"\)!i","callback_preg",$string);


hier is mijn versie (getest), een beetje geoptimaliseerd :)
Das idd een stuk beter. :D

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

drm schreef op 17 mei 2004 @ 14:04:
Mja, ik vind het eigenlijk een oplossing in de orde "Plakband" :+
yep, das waar :)
maarja, het lijkt me niet dat dit het enige is wat er ooit veranderd zou moeten worden, en om nu ff in 5 minuten dynamische parser in elkaar te gaan fabrieken vind ik ook niets.
En dan ook nog.. de TS lijkt me nog niet al te bekend met php en om dan meteen een ingewikkelde oplossing voor te schotelen is naar mijn mening ook niet echt handig.
Pagina: 1