webForumDet fria alternativet

explode med regexp?

6 svar · 319 visningar · startad av aasah

aasahMedlem sedan mars 20034 471 inlägg
#1

Går det, och i så fall hur, att få en sträng uppdelad som explode fast på ett regexp i stället för en fast delsträng?

Alltså jag skulle vilja explodera en sträng på numreringen 1), 2), 3)... och om det funkar med regexp är det ju lätt, annars betydligt värre...

spangoMedlem sedan juni 20008 205 inlägg
aasahMedlem sedan mars 20034 471 inlägg
#3

Tack, spango! :D Hittade något ännu bättre tack vare dig: preg_replace .

Men ... det funkar bara ibland???

Jag har en fil i vilken det ligger frågesportsfrågor på vettig form för oss människor:

1) Hur lång är en timme?
* 30 min
* 60 min (correct)
* 30 sek
* 60 sek

2) Vad heter Sveriges huvudstad?
* Malmö
* Stockholm (correct)
* Oslo

3)
....

(Fast med andra frågor....)

Jag vill förvandla den till följande:

::Q
Hur lång är en timme?
#A
30 min
#A
60 min
%%
1
#A
30 sek
#A
60 sek
::Q 
Vad heter Sveriges huvudstad?
#A
Malmö
#A
Stockholm 
%%
1
#A
Oslo
::Q
....

Följaktligen skriver jag:

$txtStr = preg_replace("/\\n[\\d]+\\)/", "::Q\\n", $txtStr);
echo "::Q added: \\n" . nl2br("$txtStr"); //Funkar galant
$txtStr = preg_replace("/\\* /", "#A\\n", $txtStr); //händer ingenting
echo "#A added: \\n" . nl2br("$txtStr");
$txtStr = preg_replace("/\\(correct\\) /", "\\n%%\\n1", $txtStr);  //händer ingenting
echo "%% added: \\n" . nl2br("$txtStr");

Resultatet blir:


::Q
Hur lång är en timme?
* 30 min
* 60 min (correct)
* 30 sek
* 60 sek

::Q
Vad heter Sveriges huvudstad?
* Malmö
* Stockholm (correct)
* Oslo

::Q
....

???

  1. VAR kommer den tomma raden före ::Q ifrån??? Jag trodde jag ersatte den?
  2. Varför ignoreras de två sista preg_replace:n??? :q
    Vad är det nu jag inte ser.... :q

RED: Det blir tyvärr ett " " (mellanslag) före ::Q här på wF.
Det har inte jag satt dit och det finns inte i min fil. (Är det baksidan med att fixa
smileys först på raden kanske?) Nåja, låtsa att det inte finns, tack!

RED 2: Lagt till den extra \ som behövs på wF för att esc-tecknen ska synas....

aasahMedlem sedan mars 20034 471 inlägg
#4

aasah skrev:

.... Följaktligen skriver jag:

$txtStr = preg_replace("/\\n[\\d]+\\)/", "::Q\\n", $txtStr);
echo "::Q added: \\n" . nl2br("$txtStr"); //Funkar galant
$txtStr = preg_replace("/\\* /", "#A\\n", $txtStr); //händer ingenting
echo "#A added: \\n" . nl2br("$txtStr");
$txtStr = preg_replace("/\\(correct\\) /", "\\n%%\\n1", $txtStr);  //händer ingenting
echo "%% added: \\n" . nl2br("$txtStr");

...

Det visade sig att när man skrev rätt så funkade de två översta preg_replace:n. Däremot inte den sista. Löste det genom att byta till str_replace sist, alltså:

$txtStr = preg_replace("/\\n[\\d]+\\)/", "::Q\\n", $txtStr);
echo "::Q added: \\n" . nl2br("$txtStr"); //Funkar galant
$txtStr = preg_replace("/\\* /", "#A\\n", $txtStr); 
echo "#A added: \\n" . nl2br("$txtStr"); //Funkar galant
$txtStr = str_replace("(correct)", "\\n%%\\n1", $txtStr);  
echo "%% added: \\n" . nl2br("$txtStr");//med str går det

preg_replace kanske inte funkar där den inte behövs?? :q

Jag får fortfarande plocka bort den tomma raden före ::Q för hand, men det är överkomligt. :)

spangoMedlem sedan juni 20008 205 inlägg
#5

Du har ett mellanslag efter slutparantesen i preg_replace-versionen, tror det är det.
Förresten, det är egentligen bättre att använda ^ i stället för \n för att matcha början på rad, och $ för att matcha slut på rad. använder man \n förutsätter man att (a) det faktiskt är en radbrytning där - vilket pajar om t.ex. filen tar slut innan raden - och att (b) radbrytningen faktiskt är \n och inget annat, vilket kan paja under Windows och Mac.

aasahMedlem sedan mars 20034 471 inlägg
#6

spango skrev:

Du har ett mellanslag efter slutparantesen i preg_replace-versionen, tror det är det...

Ååh! Vad man kan vara blind ibland! Tack, spango! :D Då fattar jag...

spango skrev:

Förresten, det är egentligen bättre att använda ^ i stället för \n för att matcha början på rad, och $ för att matcha slut på rad. använder man \n förutsätter man att (a) det faktiskt är en radbrytning där - vilket pajar om t.ex. filen tar slut innan raden - och att (b) radbrytningen faktiskt är \n och inget annat, vilket kan paja under Windows och Mac.

Jag vet, men jag ville ju att \n skulle vara med i det som byttes ut. Och det skumma är att eftersom det byter ut resten av uttrycket så hittar den ju \n, likväl byts just \n inte ut??? :q Skumt...

Använder Windows och den hittar \n ? Filen är helt skriven i en PC under Windows. Vad är det som kan paja? Hjälper det om man skriver [\n\b] istället för \n ?? Eller är det något annat som kan spöka?

spangoMedlem sedan juni 20008 205 inlägg
#7

Hm... nej, funkar det borde det vara OK.

147 ms totalt · 3 externa anrop · v20260731065814-full.3ab8d573
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
144 ms — hämta tråd, inlägg och bilagor (db)