Как перебрать, сопоставить и заменить? - PullRequest
2 голосов
/ 25 мая 2019

У меня есть несколько строк с одинаковыми фигурными скобками. Я хочу заменить их на динамические, если я получу счетчик как 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"], во-вторых, заменить {{TWO}} новым значением, т. Д.

Ответы [ 4 ]

2 голосов
/ 25 мая 2019

В цикле каждого матча вместо 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);
} 
1 голос
/ 25 мая 2019

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

$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);
} 
0 голосов
/ 25 мая 2019

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

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

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

DEMO 1


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

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

DEMO 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;
0 голосов
/ 25 мая 2019

Есть несколько проблем с вашим кодом, вам нужно убедиться, что переменная в 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-инъекцией.

...