В вашем коде у вас есть
$newposts = preg_replace($oldpost, "", $row['posts']);
, где вы фактически даете замену всей самой строки. Следовательно, он дает вам пустую строку, потому что ваш параметр 2 nd является пустой строкой.
Вы можете сопоставить точное 346
(если оно присутствует) с необязательным соответствием ,
и замените их пустой строкой. Таким образом, ваше регулярное выражение будет выглядеть так:
/(,?\s*346(\s|,|\b))?/
Фрагмент:
<?php
$oldpost = "345,346,347";
$newposts = preg_replace("/(,?\s*346(\s|,|\b))?/", "$2", $oldpost);
echo $newposts,PHP_EOL;
Демо: https://3v4l.org/MeSeK
Обратите внимание, что вышеприведенный подход работает нормально, но лучший способ решить эту проблему - explode
запятая строка и сбросить местоположение в массиве, где есть 346
и implode
это снова.
Фрагмент:
<?php
$oldpost = "345,346,347";
$posts = explode(",",$oldpost);
$index = array_search(346,$posts);
if($index !== false){
unset($posts[$index]);
}
$new_post = implode(",",$posts);
echo $new_post;
Демонстрация: https://3v4l.org/qvSEN
Обратите внимание, что если есть несколько вхождений 346
, вы можете использовать простой foreach
для их отмены.