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)
因此将 explode
与 preg_split
交换可以升级代码以处理逗号后有零个或多个 space 个字符的情况。
同样,您也可以在逗号之前引入潜在的 space 个字符,方法是在逗号之前允许它们相同。
如何将 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)
因此将 explode
与 preg_split
交换可以升级代码以处理逗号后有零个或多个 space 个字符的情况。
同样,您也可以在逗号之前引入潜在的 space 个字符,方法是在逗号之前允许它们相同。