Mysqli阵列失败了吗?

时间:2013-01-25 15:48:36

标签: php string mysqli

我有一个文本块和一个preg_match_all序列来创建文本中某些元素的数组($ matches)。

然后我使用mysqli查找第一个数组中每个字符串的相应条目,并接收第二个数组 - ($ replacement)。

我想用第二个数组替换原始文本中的第一个数组位置,重新找到第一个数组并命名为$ arraytoreplace。这是我使用的代码:

$replacement = array();
$myq = "SELECT code,title FROM messages WHERE ID=?";
if ($stmt = $mysqli2->prepare($myq)) {
   foreach($matches[1] as $value) {
     $stmt->bind_param("s", $value);
     $stmt->execute();
     // bind result variables
     $stmt->bind_result($d,$cc);
     if($stmt->fetch()) {
       $replacement[] = '<a href="'. $d .'">' . $cc . '</a>';
     }

   }
   $stmt->close();
}

如果我在str_replace之前的数组上使用var_dump,如下所示:

var_dump($arraytoreplace);
var_dump($replacement);

我明白了:

array(4) {
         [0]=> string(3) "111"
         [1]=> string(2) "12"
         [2]=> string(4) "1234"
         [3]=> string(1) "0"
         }

array(4) {
         [0]=> string(5) "hello"
         [1]=> string(2) "hi"
         [2]=> string(3) "foo"
         [3]=> string(3) "bar"
         } 

然后我使用str_replace将第二个数组放入原始文本的第一个数组中。

通常这很好,但是一旦它击中阵列标记中的10个字符串,一切都会中断。 而不是Text hello text hi我会得到Text 11foo text foo1或同样奇怪的东西。

有什么想法吗?

编辑:用于替换数组的代码如下:

$messageprep = str_replace($arraytoreplace, $replacement, $messagebody);
$messagepostprep = str_replace('#', '', $messageprep);
echo '<div class="messagebody">' . $messagepostprep . '</div>';

1 个答案:

答案 0 :(得分:0)

如果一串数字包含在较长的字符串中,即23内的1234,就会出现部分替换。

您需要在搜索字符串的边界上使用正则表达式进行替换。有点像...

$text = preg_replace("/\b" . $replace . "\b/", $value, $text);

另一个可能的解决方案是考虑更改要替换的值,以便用零填充......

Array(
    [0] => string(3) "0111"
    [1] => string(2) "0012"
    [2] => string(4) "1234"
    [3] => string(1) "0000"
)

...并确保您的搜索字符串也用零填充,因为0012永远不会与12混淆,并且会在0123中意外发现。