我有一个文本块和一个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>';
答案 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
中意外发现。