Как перебрать, сопоставить и заменить?

У меня есть несколько строк с одинаковыми фигурными скобками. Я хочу заменить их как динамические, если я получу счет как 1, тогда мне нужно заменить первое вхождение, если считать как 2, то замените второе вхождение, пока не будет выполнено условие.

<?php

include_once("con.php");
$db = new Da();

$con = $db->con();

$String = "{{ONE}} {{TWO}} {{THREE}} {{FOUR}} {{FIVE}} {{SIX}}";

 $Count = 1;
 if (preg_match_all("/\{\{[^{}]+\}\}/", $lclString, $matches)) {

    foreach ($matches[0] as $match) {
        $Count++;
        $Query = "SELECT link FROM student WHERE linkVal = '".$match."'";
        $Result = $con->query($Query);

        if ($row = $Result->fetch(PDO::FETCH_ASSOC)) {

            $NewValue = preg_replace("/\{\{[^{}]+\}\}/", $row["link"], $String);

        }
    }

        echo json_encode($NewValue);

 } 


?>

При первом появлении {{ONE}} следует заменить новым значением на $row["link"], Во-вторых, замените {{ДВА}} на новое значение и т. д.

Как насчет: $NewValue = str_replace($match, $row["link"], $String);

Toto 25.05.2019 16:38

проверю ваше предложение

Samson 25.05.2019 16:39

Тот заменил только один матч.

Samson 25.05.2019 16:41

Используйте его внутри цикла вместо preg_replace

Toto 25.05.2019 16:42

Интересно, не могли бы вы использовать что-нибудь с preg_replace_callback() нравится эта демонстрация. Не уверен, что правильно понял ваш вопрос :p

bobble bubble 25.05.2019 17:02
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
5
751
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Есть несколько проблем с вашим кодом, вам нужно убедиться, что переменная в preg_match_all() является строкой, которую вы пытаетесь найти.

Но основная проблема заключается в замене детали. Вам нужно заменить текущее значение совпадения ($match) и заменить его новой строкой — в настоящее время вы всегда заменяете новое совпадение в исходной строке. Здесь я создаю $NewValue из исходной строки и продолжаю заменять значения в ней...

if (preg_match_all("/\{\{[^{}]+\}\}/", $String, $matches)) {
    $NewValue = $String;
    foreach ($matches[0] as $match) {
        $Count++;
        $Query = "SELECT link FROM student WHERE linkVal = '".$match."'";
        $Result = $con->query($Query);

        if ($row = $Result->fetch(PDO::FETCH_ASSOC)) {
            $NewValue = preg_replace("/".preg_quote($match)."/", 
                              $row["link"], $NewValue);
        }
    }

    echo json_encode($NewValue);

}

Вам также следует изучить возможность использования подготовленных операторов, поскольку в настоящее время вы можете столкнуться с проблемами SQL-инъекций.

произошла только одна замена.

Samson 25.05.2019 16:44

заменив две строки одной и той же заменой, например {{ONE}} {{TWO}} заменив обе на 1 и 1.

Samson 25.05.2019 17:06

Можете ли вы показать, какое значение содержится в linkVal и link в таблице student? (Поскольку значение $match будет {{ONE}})

Nigel Ren 25.05.2019 17:09
Ответ принят как подходящий

В цикле для каждого совпадения вместо использования preg_replace я предлагаю вам использовать str_replace:

if (preg_match_all("/\{\{[^{}]+\}\}/", $lclString, $matches)) {
    $NewValue = $String;
    foreach ($matches[0] as $match) {
        $Count++;
        $Query = "SELECT link FROM student WHERE linkVal = '".$match."'";
        $Result = $con->query($Query);

        if ($row = $Result->fetch(PDO::FETCH_ASSOC)) {
            $NewValue = str_replace($match, $row["link"], $NewValue);
            //          ^^^^^^^^^^^^^^^^^^
        }
    }
    echo json_encode($NewValue);
} 

Помимо использования str_replace - не уверен, есть ли разница между этим и моим ответом.

Nigel Ren 25.05.2019 16:50

@Michael: Каков результат echo json_encode($NewValue); и чего вы ожидаете?

Toto 25.05.2019 16:51

@NigelRen: Конечно, это единственная разница, я прокомментировал вопрос, прежде чем опубликовать его в качестве ответа, поэтому я разместил его через 2 минуты после вас.

Toto 25.05.2019 16:52

Но ваш комментарий включает в себя первоначальный недостаток постоянной замены в исходной строке.

Nigel Ren 25.05.2019 16:53

@NigelRen: я сосредоточился на том, как правильно заменить, затем исправил ошибку при ответе, и str_replace намного эффективнее, чем preg_replace

Toto 25.05.2019 16:55

способный заменить единичное вхождение.

Samson 25.05.2019 17:00

@Michael: Вставьте отладку в свой код, что содержит $row["link"] (например)

Toto 25.05.2019 17:02

$row["link"] содержит, например, ABC, XYZ, PQR, HGK и т. д.

Samson 25.05.2019 17:09

В первом случае я хочу заменить ABC, а затем 2-й XYZ, 3-й PQR как петли.

Samson 25.05.2019 17:10

@Michael: добавьте больше отладки, напечатайте $match, $row["link"], $NewValue до и после замены, ...

Toto 25.05.2019 17:21

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

$String = "{{ONE}} {{TWO}} {{THREE}} {{FOUR}} {{FIVE}} {{SIX}}";
if (preg_match_all("/\{\{[^{}]+\}\}/", $String, $matches)) {
    $Query = "SELECT linkVal, link FROM student WHERE linkVal IN('".implode("','", $matches[0])."')";
    $Result = $con->query($Query);
    if ($rows = $Result->fetchAll(PDO::FETCH_ASSOC)) {
        $NewValue = str_replace(array_column($rows, 'linkVal'), array_column($rows, 'link'), $String);
    }
    echo json_encode($NewValue);
} 

@Michael Майкл, вы знаете, возвращает ли запрос какие-либо результаты? Можно var_dump($rows);?

Nick 25.05.2019 17:01

запрос, возвращающий несколько разных результатов

Samson 25.05.2019 17:08

@Michael, если запрос возвращает результаты, str_replace должен работать - вот пример: 3v4l.org/ch9HV

Nick 25.05.2019 17:12

@Майкл, извините, только что понял, что у меня опечатка в коде. Можете ли вы попробовать еще раз (я отредактировал ответ)

Nick 25.05.2019 17:13

@Майкл, не могли бы вы сообщить мне, что вы получаете с var_dump($rows);? Если бы я мог видеть это, я уверен, что мог бы решить проблему быстро.

Nick 26.05.2019 02:33

на var_dump() я получаю два разных изображения <img src = "локальный/image1.png"> <img src = "локальный/image2.png">

Samson 26.05.2019 06:23

Происходит вторая замена.

Samson 26.05.2019 06:29

Происходит только последняя замена.

Samson 26.05.2019 06:54

@Michael, изображения, на которые вы ссылаетесь, находятся на вашем локальном сервере, поэтому я их не вижу. Но похоже, что вы нашли ответ, так что не беспокойтесь об этом.

Nick 26.05.2019 09:18

Выражение, которое мы могли бы создать здесь, может быть похоже на одно из следующих:

({{)(.+?)(}})

который использует только группы захвата ().

ДЕМО 1


(?:{{)(.+?)(?:}})

и здесь мы можем использовать незахватывающие группы (?:), если мы не хотим сохранять {{ и }}.

ДЕМО 2

Тогда мы могли бы просто сделать preg_replace то, что хотели сделать.

Тестовое задание

$re = '/(?:{{)(.+?)(?:}})/m';
$str = '{{ONE}} {{TWO}} {{THREE}} {{FOUR}} {{FIVE}} {{SIX}}';
$subst = '$1';

$result = preg_replace($re, $subst, $str);

echo "The result of the substitution is ".$result;

Вы можете использовать preg_replace_callback для повторения ваших совпадений.

например

$str = "{{ONE}} {{TWO}} {{THREE}} {{FOUR}} {{FIVE}} {{SIX}}";
$replaced = preg_replace_callback('/{{([^{}]*)}}/', function($match) {
// $match[1] contains the current match (first capture group) e.g. ONE
// return your replacement for the current match, e.g. reversed string ENO
return strrev($match[1]);
}, $str);
echo $replaced;

Вывод будет ENO OWT EERHT RUOF EVIF XIS

Другие вопросы по теме