如何将html代码插入php正则表达式



所以我目前正在制作一个论坛软件。我想要的论坛软件是一个自定义模板引擎。在大多数情况下,我已经创建了模板引擎,但我在用于IF、ELSEIF和FOREACH语句的正则表达式方面遇到了一个小问题。

我遇到的问题是,当我在regex中放入一大块html代码时,什么都不会起作用。以下是一个示例:https://regex101.com/r/jlawz3/1.

以下是用于检查正则表达式的PHP代码。

$isMatchedAgain = preg_match_all('/{IF:(.*?)}[s]*?(.*?)[s]*?{ELSE}[s]*?(.*?)[s]*?{ENDIF}/', $this->template, $elseifmatches);
for ($i = 0; $i < count($elseifmatches[0]); $i++) {
$condition = $elseifmatches[1][$i];
$trueval   = $elseifmatches[2][$i];
$falseval  = (isset($elseifmatches[3][$i])) ? $elseifmatches[3][$i] : false;
$res = eval('return ('.$condition.');');
if ($res===true) {
$this->template = str_replace($elseifmatches[0][$i],$trueval,$this->template);
} else {
$this->template = str_replace($elseifmatches[0][$i],$falseval,$this->template);
}
}

你可以这样做:

function render($content) {
$match = preg_match_all('/{IF:((.*?))}(.*?){ELSE}(.*?)({ENDIF})/s', $content, $matches, PREG_OFFSET_CAPTURE);
if (!$match) {
return $content;
}

$beforeIf = substr($content, 0, $matches[0][0][1]);
$afterIf = substr($content, $matches[4][0][1] + strlen('{ENDIF}'));
$evalCondition = eval('return (' . $matches[1][0][0] . ');');

if ($evalCondition) {
$ifResult = $matches[2][0][0];
} else {
$ifResult = $matches[3][0][0];
}

return
$beforeIf .
$ifResult .
render($afterIf);
}

工作示例。

这是第一步。例如,如果你在if.中有一个if,这就不起作用了

谈到提到的安全风险。由于我们使用eval(昵称EVIL-有原因(。您永远不应该通过eval处理用户输入——或者根本不应该使用eval——总有更好的解决方案。

对我来说,看起来你想给用户写";代码";在他们的岗位上。如果是这样的话,你可以看看类似bbcode的东西。

无论你做什么,都要确保提供所需的功能。举个例子:

!isset($_SESSION['loggedin'])

你可以这样做:

{IS_LOGGED_IN}
Output whatever you want :)
{/IS_LOGGED_IN}

您的渲染器将专门查找此标记并采取相应的操作。

因此,经过一番研究,我发现可以通过在regex语句的末尾添加/ims来解决我所面临的问题。所以现在我的regex语句看起来像:

/{IF:(.*?)}[s]*?(.*?)[s]*?{ELSE}[s]*?(.*?)[s]*?{ENDIF}/ims

最新更新