php find exact match and delete

198
04 октября 2017, 10:10

Есть код который ищет число в файле, и удаляет его если оно присутствует, а если нет то ничего не делает:

$key = $_REQUEST['del'];
$filename = 'list.txt';
$lines = file($filename);
$output = '';
foreach ($lines as $line) {
    if (!strstr($line, $key)) {
        $output .= $line;
    } 
}
file_put_contents($filename, $output);

Но проблемы возникают когда допустим в файле число 11 или 15 и при попытке удалить число 1, которого там нет, удалятся и 11 и 15 (то есть все что начинается с 1). Как сделать так чтобы удалялось только точное число? Пытался поменять strstr на preg_match, не получилось...

Answer 1

Что то вроде - (?:\D|^)(1)(?:\D|$) (то что в первое в голову пришло), найти 1 если вокруг не цифры.

Пример

$key = 1;
$lines = ['asda asdf sdfasdas 11 adsdsdf', 'фыавыва ывавва  1 ыпвап ываыв 1'];
$output = '';
foreach ($lines as $line) {
    if (!preg_match("/(?:\D|^)($key)(?:\D|$)/", $line)) {
        $output .= $line;
    } 
}
echo $output;
Answer 2

Читайте файл целиком, зачем он вам по строкам?

$txt = file_get_contents("list.txt"); 
$value = 15; // число для удаления
$txt = preg_replace("/\b($value)\b/", "", $txt);
file_put_contents("list.txt", $txt) 

Впрочем, нет смысла записывать контент файла обратно, если совпадение не найдено. Поэтому можете:

  1. либо предварительно проверить совпадения, и если они имеются провести замену и сохранить в файл.
  2. Либо второй вариант - провести замену, и проверить длину строк до замены и после, если не совпадает - то записать.

не забывайте также, что входные данные необходимо провалидировать, прежде чем подставить в регулярное выражение. То есть если вы хотите убрать число, то удостоверьтесь, что передается именно число. В прочих случаях экранируйте значения с помощью preg_escape.

READ ALSO
Переход по кнопке Submit

Переход по кнопке Submit

Есть <input type="submit" name="button" value="РЕГИСТРАЦИЯ">, после нажатия происходят действия на сервере(запись в бд) и после этого должно переходить на другую...

196
Как провести слияние двух строк в PHP

Как провести слияние двух строк в PHP

Прошу помощи решить данную проблему

182
$wp_filesystem return null

$wp_filesystem return null

Глобальная переменная $wp_filesystem в WordPress возвращает nullВ чем может быть проблема?

156