我有多个带有相同花括号的字符串,如果我将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}},以此类推。
答案 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)
我们可能希望在此处设计的表达式可能类似于以下之一:
({{)(.+?)(}})
,仅使用捕获组()
。
(?:{{)(.+?)(?:}})
如果我们不想保留(?:)
和{{
,则可以在这里使用非捕获组}}
。
然后,我们可以简单地执行我们想做的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