[REGEXP] quoted attributes

Pagina: 1
Acties:

  • Jurgle
  • Registratie: Februari 2003
  • Laatst online: 25-03 00:07

Jurgle

100% Compatible

Topicstarter
Stel je hebt een string met daarin een XML tag met daarin een aantal attributes:

PHP:
1
$str = '<item foobar=\'singlequoted\' nogeenatt="iets met spaties" dederde=heeftgeenquotes />';


ik kom maar niet op de regexp, waarmee ik de string kan splitten op spaties (of eigenlijk, op whitespace), waarbij de spaties tussen quotes genegeerd wordt. Dus:

PHP:
1
2
$doel_array = preg_split($pattern_waar_ik_naar_zoek, $str);
print_r($doel_array);


zou als resultaat moeten geven:
code:
1
2
3
4
5
6
7
Array (
   [0] => <item
   [1] => foobar=\'singlequoted\'
   [2] => nogeenatt="iets met spaties"
   [3] => dederde=heeftgeenquotes
   [4] => />
)


Heeft iemand raad?

My opinions may have changed but not the fact that I am right ― Ashleigh Brilliant


  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

Je zou iets als dit kunnen doen: %<([a-z]+) (([a-z]+)=(["'](.*?)['"]|[a-z]))*.*?>%i

Geen idee of het werkt, maar je zou daarmee al in de buurt moeten komen ;)

Blog [Stackoverflow] [LinkedIn]


  • Jurgle
  • Registratie: Februari 2003
  • Laatst online: 25-03 00:07

Jurgle

100% Compatible

Topicstarter
Daar kan ik toch niet op splitten? daar kan ik enkel op matchen...

Daarbij komt nog dat als er een > tussen de quotes staat, het ook fout zou gaat

My opinions may have changed but not the fact that I am right ― Ashleigh Brilliant


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 11-03 14:33

NMe

Quia Ego Sic Dico.

Jurgle schreef op woensdag 22 februari 2006 @ 22:46:
Daar kan ik toch niet op splitten? daar kan ik enkel op matchen...

Daarbij komt nog dat als er een > tussen de quotes staat, het ook fout zou gaat
Dat mag in correcte XML niet voorkomen, aangezien een > daar naar zijn bijbehorende entity vertaald zou moeten worden. Is het verder niet zo dat in valide XML geen enkele quotes gebruikt mogen worden, en het gebruik van géén quotes ook niet is toegestaan? Dat zou het zaakje een stuk eenvoudiger maken. :)

Mocht het niet lukken met een regexp dan zijn er ook allerlei XML/DOM functies die je kan gebruiken, of je maakt zelf een stackbased parser. :P

'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.


  • Jurgle
  • Registratie: Februari 2003
  • Laatst online: 25-03 00:07

Jurgle

100% Compatible

Topicstarter
De spreekwoordelijke spijker op de spreekwoordelijke kop! Tidy voldoet niet helemaal aan mijn wensen en ik ben zelf een soort van X(HT)ML correcter aan het maken. Dit betekend dat > voor mogen komen en single quotes of zelfs geen quotes ook.
De output is correcte X(HT)ML.

Daarom maakt ik liever gebruik van een regexp dan van bestaand DOM spul.

My opinions may have changed but not the fact that I am right ― Ashleigh Brilliant


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 11-03 14:33

NMe

Quia Ego Sic Dico.

Jurgle schreef op woensdag 22 februari 2006 @ 23:15:
Daarom maakt ik liever gebruik van een regexp dan van bestaand DOM spul.
Je vergeet mijn tweede alternatieve optie, die over het algemeen een stuk robuuster te maken is. ;)

[ Voor 12% gewijzigd door NMe op 22-02-2006 23:17 ]

'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.


  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Ik denk dat je eerst complete tags moet matchen, en daarbinnen pas de attributen eruit moet filteren met zoiets:
PHP:
1
preg_match_all('/(?:\s*)(\w+)=([\'"]?)(.*?)\\2(?=(\s|\s*\/?>))/', $str, $match);

[ Voor 7% gewijzigd door crisp op 22-02-2006 23:23 ]

Intentionally left blank


  • Jurgle
  • Registratie: Februari 2003
  • Laatst online: 25-03 00:07

Jurgle

100% Compatible

Topicstarter
Daar wilde ik op terug komen, ik zoek even uit wat een stackbased parser is... of is het een chique woord voor een simpele routine?

My opinions may have changed but not the fact that I am right ― Ashleigh Brilliant


  • Jurgle
  • Registratie: Februari 2003
  • Laatst online: 25-03 00:07

Jurgle

100% Compatible

Topicstarter
crisp schreef op woensdag 22 februari 2006 @ 23:18:
Ik denk dat je eerst complete tags moet matchen, en daarbinnen pas de attributen eruit moet filteren met zoiets:
PHP:
1
preg_match_all('/(?:\s)(\w+)=([\'"]?)(.*?)\\2(?=[\s\/>])/', $str, $match);
Waardevolle tip!

My opinions may have changed but not the fact that I am right ― Ashleigh Brilliant


  • Jurgle
  • Registratie: Februari 2003
  • Laatst online: 25-03 00:07

Jurgle

100% Compatible

Topicstarter
voor degene die ooit hetzelfde probleem heeft: een tag is met de volgende pattern op te knippen (met preg_match_all:

pattern: '/((<\s*\w)|(\/?\s*>)|(\s+\w+=([\'"]?).*?\\5(?=[\s\/>])))/'

Met dank aan Crisp voor de aanzet
Note van -NMe- dat dit pattern ook niet valide XML matched

[ Voor 8% gewijzigd door Jurgle op 23-02-2006 00:12 ]

My opinions may have changed but not the fact that I am right ― Ashleigh Brilliant

Pagina: 1