PHP preg_replace 逗号 select 选项

PHP preg_replace commas select option

如何将 select 选项中的逗号替换为制动器以更改此选项:

为此:

看来我当前的代码不再有效了:

// $row[1] = "enum('1','2','3','4','5','6','7','8','9','10')";
$options = explode("', '", preg_replace("/(enum|set)\('(.+?)'\)/", "\2", $row[1]));

第一张图片的完整代码:

        $row = $db->query("SHOW COLUMNS FROM namemap LIKE 'multiplier'");
    $row = $row->fetch_row();

    $options = explode("', '", preg_replace("/(enum|set)\('(.+?)'\)/", "\2", $row[1]));

    print("<tr><td align='left' class='header'>Multiplier:</td>");
    print("<td align='left' class='lista' colspan='2'><select name='multiplier'>");

    foreach($options as $multiplier) {
        $option = "<option ";

        if ($multiplier == $results['multiplier'])
            $option .= "selected=selected ";

        $option .= "value=".$multiplier.">" . unesc($multiplier) . "</option>";

        print($option);
    }
    print("</select></td></tr>");

下面是我如何分离枚举字符串。不是最优雅的东西,但它有效:

$options = explode(",",str_replace("'","", str_replace('enum(', '', str_replace(')','', $row[1]))));

我还去掉了 print() 语句。您可以直接输出 html - 将 html 表示与 php 逻辑分开有助于使代码更加清晰和灵活。

<?php

$row = array("multiplier","enum('1','2','3','4','5','6','7','8','9','10')","YES","","1","");
$options = explode(",",str_replace("'","", str_replace('enum(', '', str_replace(')','', $row[1]))));
?>

<tr><td align='left' class='header'>Multiplier:</td>
<td align='left' class='lista' colspan='2'><select name='multiplier'>
<?php foreach($options as $multiplier) {
    $s='';
    if ($multiplier == $results['multiplier']) $s="selected";
?>
<option value='<?php echo $multiplier?>' <?php echo $s?>><?php echo $multiplier?></option>
<? } ?>
</select></td></tr>

我认为您找到了它不再工作的正确位置:

$options = explode("', '", preg_replace("/(enum|set)\('(.+?)'\)/", "\2", $row[1]));

原因是拆分字符串“', '”在逗号后包含一个space,而从preg_replace返回的字符串在逗号后没有space逗号。

因此使用带有固定字符串的 explode 不再足够,因为在数据库中输入这些值可能有或没有逗号后的 space(s) (甚至可能更早?)。

一旦看到,修复就很简单了。一种解决方案是在“爆炸”时也使用正则表达式模式,有一个带有 preg_replace 的姊妹函数,它被称为 preg_split:

$options = preg_split("/',\s*'/", ...);
                          ^^^
               \s : space character
               *  : zero or more, as many as possible (greedy)

因此将 explodepreg_split 交换可以升级代码以处理逗号后有零个或多个 space 个字符的情况。

同样,您也可以在逗号之前引入潜在的 space 个字符,方法是在逗号之前允许它们相同。