0

テキストのブロックと、テキスト内の特定の要素から配列($ matches)を作成するためのpreg_match_allシーケンスがあります。

次に、mysqliを使用して最初の配列の各文字列に対応するエントリを検索し、2番目の配列-($ replace)を受け取ります。

元のテキストの最初の配列の位置を2番目の配列に置き換え、最初の配列を再検索して$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を使用して、2番目の配列を元のテキストの最初の配列の場所にドロップします。

通常、これは問題ありませんが、配列マークの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

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です。

于 2013-01-25T16:22:42.547 に答える