[regex] option tags xhtml compliant maken

Pagina: 1
Acties:

  • killercow
  • Registratie: Maart 2000
  • Laatst online: 07-05 21:02
Ik ben bezig om een stukje code te maken wat van "brakke" html 4 xhtml moet kunnen maken.

nu gebruik ik voor images de volgende code:
PHP:
1
$string = ereg_replace('<img([^>]*[^/])>', '<img \\1 />', $string);


En deze doet het perfect,
Nu heb ik het zelfde voor andere "single" tags waarvan ik vrij zeker ben dat mensen niet ook nog eens een end-tag gaan gebruiken.

De option tag heeft echter het probleem dat mensen soms wel een /option tag gebruiken en soms niet.

En ik moet natuurlijk alleen de <option *> tags aanpassen zodat ze xhtml compliant worden.

De reden waarom ik dit wil doen is omdat mijn xml parser het anders niet meer snapt.

Ik heb de volgende regels bedacht:
<option> (alleen een kale option tag)
<option(.*)> (een option tag met of zonder inhoud.
<option(.*([^>]*[^/]))> een option tag die niet zelf sluitend is, en alleen het stuk wat in de tag zelf staat moet gevonden worden.

En daarna weet ik het niet zo goed meer,
Kijkend naar de html specs zie ik dat er geen tags in een option tag mogen staan en dat we er dus van uit mogen gaan dat alles tot de volgende open of sluit tag bij deze option tag hoort.
<option value=test>naam<option>
of
<option value=test>naam</select>

Maar als de volgende tag een sluitende </option> tag is moet hij hem niet vinden.

Ik heb nu dit:
PHP:
1
$string = ereg_replace('<option([^>]*)>(*)<^[/option]','<option \\1 />\\2</option>', $string);

Maar dat doet het niet.
Ook zouden end tag haakjes in argumenten binnen de beginnende option tag niet gerekend mogen worden,

Kan iemand me in de jusite richting pointen?

openkat.nl al gezien?


  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Ik heb het even geprobeerd en ben hier op gekomen:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php

$optionRegex = "/<option([^>]*)>([^<]*)(?:<\/option>)?/m";

$optionReplace = "<option\\1>\\2</option>";

$testString = "
<select>
    <option value=abc>123</option>
    <option value=def>345
    <option value=ghi>678</option>
</select>
";

echo preg_replace(
    $optionRegex,
    $optionReplace,
    $testString
);

?>


Ik heb het niet uitgebreid getest. Ik weet ook niet zeker of dit nu is wat je precies wilt, maar het komt wel in de buurt denk ik. Als je uitleg wilt over de werking kan ik dat wel even doen.

Verder raad ik je aan ook deze pagina eens te lezen: http://nl2.php.net/tidy

[ Voor 13% gewijzigd door Michali op 21-04-2005 13:49 ]

Noushka's Magnificent Dream | Unity


  • killercow
  • Registratie: Maart 2000
  • Laatst online: 07-05 21:02
Dank je, dat werkt inderdaad perfect,

Volgens mij moet ik hem zo lezen:

code:
1
2
3
4
5
<option    option zoeken
([^>]*)      alle chars behalve >
>             Tot > zoeken
([^<]*)      Alles behalve < Of
(?:<\/option>)?/m   Zoeken tot eventuele </option> en dan niet vinden ofzo?


Dat laatste vidt ik wat onduidelijk. Kan je dat uileggen?

openkat.nl al gezien?


  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Dat laatste klopt idd. (?: ) is een non-capturing sub pattern. Dat houdt in dat je hem in de replace niet kunt gebruiken. \3 bestaan dus niet. Op zich overbodig, maar ik vind het wel zo netjes. Ik had die ronde haken nodig omdat ik de gehele </option> optioneel wilde maken mbv. van de '?' er achter. Echter heb ik hem verder niet nodig in de replace en dat wilde ik expliciet aangeven. En als laatste nog een m modifier welke voor multiline staat. Dit omdat een option ook over meerdere regels geplaatst kan worden.

Noushka's Magnificent Dream | Unity


  • killercow
  • Registratie: Maart 2000
  • Laatst online: 07-05 21:02
Ah,

Dan had ik het toch goed,

Grotendeels kan ik ze wel redelijk goed zelf schrijven. Maar sommige dingen zijn toch nog wel wat ingewikkeld.

openkat.nl al gezien?


  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Je moet even de manier van denken door krijgen. Als dat er goed in zit dan gaat het wel. Sommige dingen blijven inderdaad wel altijd moeilijk en soms is het vrijwel onmogelijk. Ik zou eens die Pattern Syntax pagina doornemen en gewoon aan de preg_* functies gaan. Die ondersteunen meer en zijn ook een stukje sneller. Bovendien zit deze manual erbij wat ook wel handig is.

Noushka's Magnificent Dream | Unity

Pagina: 1