【问题标题】:preg_replace values in a string with values from mysql assoc while looppreg_replace 用 mysql assoc while 循环中的值替换字符串中的值
【发布时间】:2013-02-19 10:56:12
【问题描述】:

编辑: 更新了 PHP 以解决 $_POST 处理程序中的数组到字符串转换问题,while 循环现在显示正确的条目数并正确替换字符串,但只显示替换的值用于每次循环时数据库中的第一个条目。

我目前正在构建一个使用模板系统向人们批量发送消息的系统。 标记中包含的值将被数据库结果中的值替换。例如,写入的消息可能是:

您好,感谢您在购买。

替换后的结果为:

您好 Joe Bloggs,感谢您在 2013 年 1 月 1 日购买智能手机。

要替换的字段是从数据库中动态创建的,而数据库又是由用户上传 CSV 文档创建的。这意味着字段名称是不可预测的,我正在使用show columns from table SQL 函数来填充我要查找的名称。

我正在努力从我发布的值中获取值以通过 mysql_assoc 循环替换字符串中的值。

表单输入的 HTML 是使用来自 show columns 的 PHP 循环为每个结果创建的,每个输入看起来像:

<input type="hidden" name="fields[]" value="column name" />

还有一个文本区域:

<textarea name="message"></texarea>

我要处理的 PHP 是:

if(isset($_POST['fields'])) {
    $strings = array();
    foreach($fields as $f) {
        $strings[] = "/<{".$f."}>/";
    }
    $replace = $_POST['fields'];
}

而当前循环是:

$query = "select * from $table_name";
    $result = mysql_query($query) or die(mysql_error());
    $string = $_POST['message'];
    $pattern = $strings;

    while($name = mysql_fetch_array($result, MYSQL_ASSOC)) {
    foreach ($replace as $r) {
        $replacement[] = $name[$r];
    }
    $message = preg_replace($pattern, $replacement, $string);
    echo "<p>$message</p>";
    }

$table_name 在文档的开头声明。

帖子有效,创建的数组似乎是正确的,所以我认为我的问题在于 while 循环的内容。截至目前,它没有返回任何内容,我怎样才能将$name[] 的正确替换值放入$replacement 数组中,然后循环以使每条消息的格式都正确?

【问题讨论】:

  • $strings = "/&lt;{".$_POST['fields']."}&gt;/"; - 数组到字符串的转换,查看错误日志
  • 我用:$fields = $_POST['fields']; $strings = array(); foreach($fields as $f) { $strings[] = "/&lt;{".$f."}&gt;/"; } 修复了这个问题,但它现在循环结果的第一个条目以获得条目总数。

标签: php arrays while-loop preg-replace


【解决方案1】:

你应该看看sprintf,可能会更容易。

【讨论】:

  • 你能提供一个例子来说明它是如何工作的吗?根据我从 PHP Docs 站点的了解,sprintf 和 vsprintf 都需要以特定方式格式化初始字符串,这意味着将 封装的短语替换为 %s 之类的内容,这将需要一个额外的循环不同的替换功能。
【解决方案2】:

好的,我已经解决了这个问题,我需要在 foreach 之前声明 $replacement = array();。最终结果是:

while($name = mysql_fetch_array($result, MYSQL_ASSOC)) {
$replacement = array();
foreach ($replace as $r) {
    $replacement[] = $name[$r];
     }
  $message = preg_replace($pattern, $replacement, $string);
  echo "<p>$message</p>";
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-29
    • 2023-02-14
    • 2016-03-04
    • 2020-01-29
    • 2021-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多