/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
regexp/preg_match_all problem
Fra : Leif Neland


Dato : 30-12-08 15:43

Jeg prøver at preg_match_all'e et javascript-array ud fra en hel streng
af html, her er et eksempel på arrayet:

var images =
['images/products/movies/13750_1.jpg','images/products/movies/13750_2.jpg']

Her er et klip php
// $data er en lang steng med html
   $exp="/var images = \[(,?'[^']*')*]/";
   $res=preg_match_all($exp,$data,$matches,PREG_SET_ORDER);
   echo "<hr>Matches: ".$res." Exp = ".$exp."<br>";
   print_r_html($matches); // print_r, der skriver ud i html
   
Resultat:
Matches: 1 Exp = /var images = \[(,?'[^']*')*]/
Array

* 0 => Array
o 0 => var images =
['images/products/movies/13750_1.jpg','images/products/movies/13750_2.jpg']
o 1 => ,'images/products/movies/13750_2.jpg'


Hvorfor får jeg kun det sidste element i arrayet?

Det jeg prøver at sige i exp er:
$exp="/var images = \[(,?'[^']*')*]/";

"var images = \[" Strengen skal starte med "var images = [" ([ er ikke
start af en klasse, er derfor escapet).

"("   Gentag
   ",?"      0 eller 1 komma
   "'"      Anførselstegn
   "[^']*"      nogle tegn, er ikke er anførselstegn
   "'"      Anførsestegn
")*"   Et antal gentagelser af ovenstående
"]"   Slutbracket for array. Skal ikke escapes; det er ikke en klasse,    da
det ikke er startet med [

Hvad gør jeg galt?

Jeg har også prøvet med /var images = \[(,?'([^']*)')*]/
Det giver pænt filnavnet uden '', som jeg egentlig vil have, men stadig
kun det sidste element.
/var images = \[((,?)'([^']*)')*\]/ giver ingen forskel
PREG_PATTERN_ORDER i stedet for PREG_SET_ORDER returnerer stadig kun det
andet element

Leif

PS: Undskyld det lange indlæg; denne gang hjalp det ikke at formulere
problemet for mig selv. Nogle gange er det nok at skrive et spørgsmål;
når det er formuleret grundigt nok så andre kan forstå det, så ser man
løsningen selv.

Jeg havde en kollega, der havde en tøjbamse, der bare skulle bruges til
at lytte til problemformuleringen. Det var mere effektivt end at jeg
skulle bruges til det. Men jeg ville da ikke have noget imod at være
tøjbamse for hende

 
 
Leif Neland (30-12-2008)
Kommentar
Fra : Leif Neland


Dato : 30-12-08 15:57

Leif Neland skrev:
> Jeg prøver at preg_match_all'e et javascript-array ud fra en hel streng
> af html, her er et eksempel på arrayet:
>
> var images =
> ['images/products/movies/13750_1.jpg','images/products/movies/13750_2.jpg']

Løsningen blev at splitte det op i to:

   $exp="|var images = \[([^]]*)\]|";
   $res=preg_match_all($exp,$data,$matches,PREG_SET_ORDER);
   $arrstr=$matches[0][1];
// Alt mellem [], f.ex.
'images/products/movies/13750_1.jpg','images/products/movies/13750_2.jpg'
   
   $exp="|'([^']*)'|";
   $res=preg_match_all($exp,$arrstr,$matches,PREG_PATTERN_ORDER);
   $images = $matches[1];

Resultat:
* 0 => Array
o 0 => 'images/products/movies/13750_1.jpg'
o 1 => 'images/products/movies/13750_2.jpg'
* 1 => Array
o 0 => images/products/movies/13750_1.jpg
o 1 => images/products/movies/13750_2.jpg

Leif

Martin Larsen (05-01-2009)
Kommentar
Fra : Martin Larsen


Dato : 05-01-09 20:15

Leif Neland wrote:

> Jeg prøver at preg_match_all'e et javascript-array ud fra en hel streng
> af html, her er et eksempel på arrayet:

Interessant problem. Min første tanke var at det måtte da være nemt, men
nej!

At du får den sidste skyldes at du repeterer en capturing parantes, og
så man iflg. manualen altid den sidste match. Så langt så godt.

Man skulle så tro at det var muligt at opbygge udtrykket uden
repetering, men efter en time har jeg ikke fundet en fungerende løsning.

Jeg har stadig en ide om at det skulle kunne lade sig gøre ved en eller
anden snedig brug af lookaround e.lign. men den er godt nok svær at knække.

Hilsen
Martin

Søg
Reklame
Statistik
Spørgsmål : 177580
Tips : 31968
Nyheder : 719565
Indlæg : 6409081
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste