0

我有一个文本块和一个 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>';
4

1 回答 1

0

当一串数字包含在更长的字符串中时,看起来你得到了部分替换,即23inside 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永远不会120123.

于 2013-01-25T16:22:42.547 回答