Avatar billede kodak Mester
05. marts 2023 - 00:10 Der er 11 kommentarer og
2 løsninger

function replace

Jeg kan ikke få denne function til at virke

[code]

function replaceString($string, $string_id) {
        $patterns = array('/\[Calc:([^]]+)\]/', '/\[Check\*(\d+)\]/', '/\[Get_(.*?)\]/');
        $replacements = array('', '<input type="checkbox" value="">', '');
   
        $matches = array();
        if (preg_match_all($patterns[0], $string, $matches)) {
            foreach ($matches[1] as $match) {
                $calculation = eval("return $match;");
                $replacements[] = $calculation;
            }
        }
   
        $matches = array();
        if (preg_match_all($patterns[1], $string, $matches)) {
            foreach ($matches[1] as $match) {
                if ($match == 1) {
                    $replacements[] = '<input type="checkbox" value="">';
                } else {
                    $radioButtons = '';
                    for ($i = 1; $i <= $match; $i++) {
                        $radioButtons .= '<input type="radio" name="radio_id" value="">';
                    }
                    $replacements[] = $radioButtons;
                }
            }
        }
   
        $matches = array();
        if (preg_match_all($patterns[2], $string, $matches)) {
            foreach ($matches[1] as $match) {
                $dsn = 'mysql:host='.DB_HOST.';dbname=bravida_rammer;charset=utf8';
                $pdo = new PDO($dsn, DB_USER, DB_PASS);
                $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                $table_name = explode("_", $match)[0];
                $table_where = explode("_", $match)[1];
                $stmt = $pdo->prepare("SELECT COUNT(*) FROM $table_name WHERE $table_where = 100");
                $stmt->execute();
                $result = $stmt->fetchColumn();
                $replacements[] = $result;
            }
        }
   
        return preg_replace($patterns, $replacements, $string);
    }

[/code]

det er meningen at den skal søge hele strengen igennem efter '[]'
når den finder en skal den se hvad den starter med og ud fra dette udføre forskellige hendlinger.

$string = '[Calc:4+7] eller [Calc:7*17] måske [Calc:6/3]'
//Output '4+7=11 eller 7*17=119 måske 6/3=2'

$string = 'Dette er en checkbox [Check*1]'
//output 'Dette er en checkbox <input type="checkbox" value="">'

$string = 'Dette er radioboxe [Check*2]'
//output 'Dette er radioboxe <input type="radio" name="$string_id" value=""><input type="radio" name="$string_id" value="">'

$string = 'Dette er flere radioboxe [Check*4]'
//output 'Dette er flere radioboxe <input type="radio" name="$string_id" value=""><input type="radio" name="$string_id" value=""><input type="radio" name="$string_id" value=""><input type="radio" name="$string_id" value="">'

$string = 'Dette er en udlæst procent [Get_ramme_status] af gruppen status i db tabellen ramme'
Output: 'Dette er en udlæst procent 50% af gruppen status i db tabellen ramme' (ud fra at der er 10 rækker i tabellen "ramme" og 5 af dem har "ststus" er = 100)
Avatar billede arne_v Ekspert
05. marts 2023 - 18:45 #1
Det er lidt nemmere at overskue, hvis man deler det op i flere funktioner.

Her er et bud:


<?php

function calc_repl($s) {
    $res = $s;
    preg_match_all('#\[Calc:([0-9+\-*/]+)\]#', $s, $m);
    for($i = 0; $i < count($m[0]); $i++) {
        $expr = $m[1][$i];
        $res = str_replace($m[0][$i], $expr . '=' . eval('return ' . $expr . ';'), $res);
    }
    return $res;
}

function check_repl($s) {
    $res = $s;
    preg_match_all('#\[Check\*([0-9]+)\]#', $s, $m);
    for($i = 0; $i < count($m[0]); $i++) {
        $n = $m[1][$i];
        if($n == 1) {
            $res = str_replace($m[0][$i], '<input type="checkbox" value="">', $s);
        } else {
            $temp = '';
            for($j = 0; $j < $n; $j++) {
                $temp .= '<input type="radio" name="$string_id" value="">';
            }
            $res = str_replace($m[0][$i], $temp, $s);
        }
    }
    return $res;
}

function get_db($nam1, $nam2) {
    return '50%';   
}

function get_repl($s) {
    $res = $s;
    preg_match_all('#\[Get_([A-Za-z]+)_([A-Za-z]+)]#', $s, $m);
    for($i = 0; $i < count($m[0]); $i++) {
        $nam1 = $m[1][$i];
        $nam2 = $m[2][$i];
        $res = str_replace($m[0][$i], get_db($nam1, $nam2), $s);
    }
    return $res;
}

function mulrepl($s) {
    $res = $s;
    $res = calc_repl($res);
    $res = check_repl($res);
    $res = get_repl($res);
    return $res;
}

function test($inpstr, $expoutpstr) {
    $outpstr = mulrepl($inpstr);
    echo "$expoutpstr\r\n";
    echo "$outpstr\r\n";
}

test('[Calc:4+7] eller [Calc:7*17] måske [Calc:6/3]', '4+7=11 eller 7*17=119 måske 6/3=2');
test('Dette er en checkbox [Check*1]', 'Dette er en checkbox <input type="checkbox" value="">');
test('Dette er radioboxe [Check*2]', 'Dette er radioboxe <input type="radio" name="$string_id" value=""><input type="radio" name="$string_id" value="">');
test('Dette er flere radioboxe [Check*4]', 'Dette er flere radioboxe <input type="radio" name="$string_id" value=""><input type="radio" name="$string_id" value=""><input type="radio" name="$string_id" value=""><input type="radio" name="$string_id" value="">');
test('Dette er en udlæst procent [Get_ramme_status] af gruppen status i db tabellen ramme', 'Dette er en udlæst procent 50% af gruppen status i db tabellen ramme');

?>
Avatar billede kodak Mester
05. marts 2023 - 20:24 #2
Hvordan fik du code rammen til at virke?
Avatar billede arne_v Ekspert
05. marts 2023 - 20:27 #3
Jeg bruger DIV i.s.f. CODE indenfor square brackets.
Avatar billede kodak Mester
05. marts 2023 - 20:56 #4
det forvirre mig.

jeg kan ikke rigtig se hoved og hale i det hele.
Outputtet på calc ser ud til at virke, men forstår ikke hvorfor den outoutter mit output eksempel.

Outputtet Check ser delvist ud til at virke men jeg får ikke id'et med og jeg har prøvet at tilføje lidt ekstra men kan ikke se om det er korrekt

[DIV]
function check_repl($s,$id) {
        $res = $s;
        preg_match_all('#\[Check\*([0-9]+)\=([0-9]+)\]#', $s, $m);
        for($i = 0; $i < count($m[0]); $i++) {
            $n = $m[1][$i];
            $c = $m[2][$i];
            if($n == 1) {
                if($c == 1) {
                    $res = str_replace($m[0][$i], '<input type="checkbox" value="" name="'.$id.'" checked>', $s);
                }else {
                    $res = str_replace($m[0][$i], '<input type="checkbox" value="" name="'.$id.'" checked>', $s);
                }
            } else {
                $temp = '';
                for($j = 0; $j < $n; $j++) {
                    $temp .= '<input type="radio" name="'.$id.'" value="">';
                }
                $res = str_replace($m[0][$i], $temp, $s);
            }
        }
        return $res;
    }
[/DIV]

har ikke set på get delen andet end jeg har tilføjet mit tidligere script men det ser ikke ud til at virke.
Avatar billede arne_v Ekspert
05. marts 2023 - 22:14 #5
Kan du vise hvad input og oputput skal være for name/id - de er ikke i #0.
Avatar billede kodak Mester
05. marts 2023 - 22:50 #6
Jeg har fået id til at virke men den henter ikke viser kun 0 i $c

echo = mulrepl($row['comment'],$row['id']); ($row er fra db)

comment = '[Check*1=1] - Checkbox (der er checked)
[Check*1=0] - Checkbox (der er ikke checked)
[Check*3=0] - 3 stk. Radiobutton (hvor ingen er cheked)
[Check*3=1] - 3 stk. Radiobutton (hvor den første er cheked)
[Check*4=3] - 4 stk. Radiobutton (hvor den tredie er cheked)'


function check_repl($s,$id) {
        $res = $s;
        preg_match_all('#\[Check\*([0-9]+)\=([0-9]+)\]#', $s, $m);
        for($i = 0; $i < count($m[0]); $i++) {
            $n = $m[1][$i];
            $c = $m[2][$i];
            if($n == 1) {
                $res = str_replace($m[0][$i], '<input type="checkbox" value="'.$c.'" name="'.$id.'"'.($c == 1 ? ' checked' : '').'>', $s);
            } else {
                $temp = '';
                for($j = 0; $j < $n; $j++) {
                    $temp .= '<input type="radio" name="'.$id.'" value="">';
                }
                $res = str_replace($m[0][$i], $temp, $s);
            }
        }
        return $res;
    }



Output:
<input type="checkbox" value="1" name="'.$id.'" checked> - Checkbox (der er checked)
<input type="radio" name="'.$id.'" value="1"> - Checkbox (der er ikke checked)
<input type="radio" name="'.$id.'" value="1"><input type="radio" name="'.$id.'" value="2"><input type="radio" name="'.$id.'" value="3"> - 3 stk. Radiobutton (hvor ingen er cheked)
<input type="radio" name="'.$id.'" value="1" checked><input type="radio" name="'.$id.'" value="2"><input type="radio" name="'.$id.'" value="3"> - 3 stk. Radiobutton (hvor den første er cheked)
<input type="radio" name="'.$id.'" value="1"><input type="radio" name="'.$id.'" value="2"><input type="radio" name="'.$id.'" value="3" checked><input type="radio" name="'.$id.'" value="4"> - 4 stk. Radiobutton (hvor den tredie er cheked)'
Avatar billede arne_v Ekspert
06. marts 2023 - 01:13 #7

<?php

function calc_repl($s) {
    $res = $s;
    preg_match_all('#\[Calc:([0-9+\-*/]+)\]#', $s, $m);
    for($i = 0; $i < count($m[0]); $i++) {
        $expr = $m[1][$i];
        $res = str_replace($m[0][$i], $expr . '=' . eval('return ' . $expr . ';'), $res);
    }
    return $res;
}

function check_repl($s) {
    $res = $s;
    preg_match_all('#\[Check\*([0-9]+)(=([0-9]+))?\]#', $s, $m);
    for($i = 0; $i < count($m[0]); $i++) {
        $n = $m[1][$i];
        $c = $m[3][$i];
        if($n == 1) {
            if($c == 1) {
                $res = str_replace($m[0][$i], '<input type="checkbox" value="" checked>', $s);
            } else {
                $res = str_replace($m[0][$i], '<input type="checkbox" value="">', $s);
            }
        } else {
            $temp = '';
            for($j = 0; $j < $n; $j++) {
                if($c == $j + 1) {
                    $temp .= '<input type="radio" name="$string_id" value="" checked>';
                } else {
                    $temp .= '<input type="radio" name="$string_id" value="">';
                }
            }
            $res = str_replace($m[0][$i], $temp, $s);
        }
    }
    return $res;
}

function get_db($nam1, $nam2) {
    return '50%';   
}

function get_repl($s) {
    $res = $s;
    preg_match_all('#\[Get_([A-Za-z]+)_([A-Za-z]+)]#', $s, $m);
    for($i = 0; $i < count($m[0]); $i++) {
        $nam1 = $m[1][$i];
        $nam2 = $m[2][$i];
        $res = str_replace($m[0][$i], get_db($nam1, $nam2), $s);
    }
    return $res;
}

function mulrepl($s) {
    $res = $s;
    $res = calc_repl($res);
    $res = check_repl($res);
    $res = get_repl($res);
    return $res;
}

function test($inpstr, $expoutpstr) {
    $outpstr = mulrepl($inpstr);
    echo "$expoutpstr\r\n";
    echo "$outpstr\r\n";
}

test('[Calc:4+7] eller [Calc:7*17] måske [Calc:6/3]', '4+7=11 eller 7*17=119 måske 6/3=2');
test('Dette er en checkbox [Check*1]', 'Dette er en checkbox <input type="checkbox" value="">');
test('Dette er en checkbox [Check*1=0]', 'Dette er en checkbox <input type="checkbox" value="">');
test('Dette er en checkbox [Check*1=1]', 'Dette er en checkbox <input type="checkbox" value="" checked>');
test('Dette er radioboxe [Check*2]', 'Dette er radioboxe <input type="radio" name="$string_id" value=""><input type="radio" name="$string_id" value="">');
test('Dette er radioboxe [Check*2=0]', 'Dette er radioboxe <input type="radio" name="$string_id" value=""><input type="radio" name="$string_id" value="">');
test('Dette er radioboxe [Check*2=1]', 'Dette er radioboxe <input type="radio" name="$string_id" value="" checked><input type="radio" name="$string_id" value="">');
test('Dette er flere radioboxe [Check*4]', 'Dette er flere radioboxe <input type="radio" name="$string_id" value=""><input type="radio" name="$string_id" value=""><input type="radio" name="$string_id" value=""><input type="radio" name="$string_id" value="">');
test('Dette er en udlæst procent [Get_ramme_status] af gruppen status i db tabellen ramme', 'Dette er en udlæst procent 50% af gruppen status i db tabellen ramme');

?>
Avatar billede kodak Mester
06. marts 2023 - 19:36 #8
så havde jeg gjort det korrekt.
Men af en eller anden orsag vil den ikke genkende '[Check*1=1]' når de kommer fra  Mysql db'en

de andre ser ud til at virke men ikke '[Check*1=1]'
Avatar billede arne_v Ekspert
06. marts 2023 - 19:54 #9
Hvordan ser check_repl ud nu og hvad er input og hvad er output?
Avatar billede kodak Mester
07. marts 2023 - 18:04 #10
Input:

[Check*1=0] - Test 1
[Check*1=1] - Test 2
[Check*1=0] - Test 3
[Check*2=0] - Test 4
[Check*2=1] - Test 5
[Check*2=2] - Test 6



    function check_repl($s) {
    $res = $s;
    preg_match_all('#\[Check\*([0-9]+)(=([0-9]+))?\]#', $s, $m);
    for($i = 0; $i < count($m[0]); $i++) {
        $n = $m[1][$i];
        $c = $m[3][$i];
        if($n == 1) {
            if($c == 1) {
                $res = str_replace($m[0][$i], '<input type="checkbox" value="'.$c.'" checked>', $s);
            } else {
                $res = str_replace($m[0][$i], '<input type="checkbox" value="'.$c.'">', $s);
            }
        } else {
            $temp = '';
            for($j = 0; $j < $n; $j++) {
                if($c == $j + 1) {
                    $temp .= '<input type="radio" name="'.$id[$i].'" value="'.$c.'" checked>';
                } else {
                    $temp .= '<input type="radio" name="'.$id[$i].'" value="'.$c.'">';
                }
            }
            $res = str_replace($m[0][$i], $temp, $s);
        }
    }
    return $res;
}

$result_comment = mulrepl($row['comment'],$row['id']).PHP_EOL;
echo "<td><pre>".$result_comment."</pre></td>";


Output:

<td><pre>[Check*1=0] - Test 1
[Check*1=1] - Test 2
[Check*1=0] - Test 3
[Check*2=0] - Test 4
[Check*2=1] - Test 5
<input type="radio" name="" value="2"><input type="radio" name="" value="2" checked> - Test 6
</pre></td>
Avatar billede arne_v Ekspert
07. marts 2023 - 18:32 #11
Der er en fejl i min kode.

$res = str_replace($m[0][$i], '<input type="checkbox" value="" checked>', $s);
$res = str_replace($m[0][$i], '<input type="checkbox" value="">', $s);
$res = str_replace($m[0][$i], $temp, $s);

skal være:

$res = str_replace($m[0][$i], '<input type="checkbox" value="" checked>', $res);
$res = str_replace($m[0][$i], '<input type="checkbox" value="">', $res);
$res = str_replace($m[0][$i], $temp, $res);
Avatar billede kodak Mester
07. marts 2023 - 21:39 #12
nice.
det så ud til at gøre tricket

Takker mange gange.
Avatar billede arne_v Ekspert
08. marts 2023 - 00:58 #13
Komplet eksempel med den fix og en ide til name værdier:


<?php

function calc_repl($s) {
    $res = $s;
    preg_match_all('#\[Calc:([0-9+\-*/]+)\]#', $s, $m);
    for($i = 0; $i < count($m[0]); $i++) {
        $expr = $m[1][$i];
        $res = str_replace($m[0][$i], $expr . '=' . eval('return ' . $expr . ';'), $res);
    }
    return $res;
}

function check_repl($s, $chkbox_f, $radio_f) {
    $res = $s;
    preg_match_all('#\[Check\*([0-9]+)(=([0-9]+))?\]#', $s, $m);
    for($i = 0; $i < count($m[0]); $i++) {
        $n = $m[1][$i];
        $c = $m[3][$i];
        if($n == 1) {
            if($c == 1) {
                $res = str_replace($m[0][$i], '<input type="checkbox" name="' . $chkbox_f($i + 1) . '" value="" checked>', $res);
            } else {
                $res = str_replace($m[0][$i], '<input type="checkbox" name="' . $chkbox_f($i + 1) . '" value="">', $res);
            }
        } else {
            $temp = '';
            for($j = 0; $j < $n; $j++) {
                if($c == $j + 1) {
                    $temp .= '<input type="radio" name="' . $radio_f($i + 1) . '" value="' . ($j + 1) . '" checked>';
                } else {
                    $temp .= '<input type="radio" name="' . $radio_f($i + 1) . '" value="' . ($j + 1) . '">';
                }
            }
            $res = str_replace($m[0][$i], $temp, $res);
        }
    }
    return $res;
}

function get_repl($s, $db_f) {
    $res = $s;
    preg_match_all('#\[Get_([A-Za-z]+)_([A-Za-z]+)]#', $s, $m);
    for($i = 0; $i < count($m[0]); $i++) {
        $nam1 = $m[1][$i];
        $nam2 = $m[2][$i];
        $res = str_replace($m[0][$i], $db_f($nam1, $nam2), $res);
    }
    return $res;
}

function mulrepl($s, $chkbox_f, $radio_f, $db_f) {
    $res = $s;
    $res = calc_repl($res);
    $res = check_repl($res, $chkbox_f, $radio_f);
    $res = get_repl($res, $db_f);
    return $res;
}

function test($inpstr, $expoutpstr, $chkbox_f, $radio_f, $db_f) {
    $outpstr = mulrepl($inpstr, $chkbox_f, $radio_f, $db_f);
    echo "$expoutpstr\r\n";
    echo "$outpstr\r\n";
}

function chkbox_nam($count) {
    return 'cb' . $count;
}

function radio_nam($count) {
    return 'r' . $count;
}

function get_db($nam1, $nam2) {
    return '50%';
}

test('[Calc:4+7] eller [Calc:7*17] måske [Calc:6/3]', '4+7=11 eller 7*17=119 måske 6/3=2', 'chkbox_nam', 'radio_nam', 'get_db');
test('Dette er en checkbox [Check*1]', 'Dette er en checkbox <input type="checkbox" name="cb1" value="">', 'chkbox_nam', 'radio_nam', 'get_db');
test('Dette er en checkbox [Check*1=0]', 'Dette er en checkbox <input type="checkbox" name="cb1" value="">', 'chkbox_nam', 'radio_nam', 'get_db');
test('Dette er en checkbox [Check*1=1]', 'Dette er en checkbox <input type="checkbox" name="cb1" value="" checked>', 'chkbox_nam', 'radio_nam', 'get_db');
test('Dette er radioboxe [Check*2]', 'Dette er radioboxe <input type="radio" name="r1" value="1"><input type="radio" name="r1" value="2">', 'chkbox_nam', 'radio_nam', 'get_db');
test('Dette er radioboxe [Check*2=0]', 'Dette er radioboxe <input type="radio" name="r1" value="1"><input type="radio" name="r1" value="2">', 'chkbox_nam', 'radio_nam', 'get_db');
test('Dette er radioboxe [Check*2=1]', 'Dette er radioboxe <input type="radio" name="r1" value="1" checked><input type="radio" name="r1" value="2">', 'chkbox_nam', 'radio_nam', 'get_db');
test('Dette er flere radioboxe [Check*4]', 'Dette er flere radioboxe <input type="radio" name="r1" value="1"><input type="radio" name="r1" value="2"><input type="radio" name="r1" value="3"><input type="radio" name="r1" value="4">', 'chkbox_nam', 'radio_nam', 'get_db');
test('Dette er en udlæst procent [Get_ramme_status] af gruppen status i db tabellen ramme', 'Dette er en udlæst procent 50% af gruppen status i db tabellen ramme', 'chkbox_nam', 'radio_nam', 'get_db');
test("[Check*1=0] - Test 1\r\n[Check*1=1] - Test 2", "<input type=\"checkbox\" name=\"cb1\" value=\"\"> - Test 1\r\n<input type=\"checkbox\" name=\"cb2\" value=\"\" checked> - Test 2", 'chkbox_nam', 'radio_nam', 'get_db');

?>
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester