如何循环,匹配和替换?

时间:2019-05-25 14:32:12

标签: php regex preg-replace preg-match-all regex-group

我有多个带有相同花括号的字符串,如果我将count设为1,则希望将其替换为动态字符串,然后需要替换第一个匹配项;如果count为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}},以此类推。

5 个答案:

答案 0 :(得分:2)

在每次比赛的循环中,建议您不要使用preg_replace

str_replace

答案 1 :(得分:1)

通过在一个查询中获取所有替换值,可以大大简化代码:

$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);
} 

答案 2 :(得分:0)

您的代码存在一些问题,您需要确保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注入问题。

答案 3 :(得分:0)

我们可能希望在此处设计的表达式可能类似于以下之一:

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

,仅使用捕获组()

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;

答案 4 :(得分:0)

您可以使用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