如何在PHP中动态替换符号之间的文本并替换为常量?
How to dynamically replace text between symbols and replace with a constant in PHP?
我有一个问题,我需要搜索 HTML page/snippet 并替换四个百分位符号之间的任何值并转换为常数变量,例如%%THIS_CONSTANT%% 变为 THIS_CONSTANT。
现在我正在逐行搜索页面,我能够找到匹配项并使用 preg_match_all 和 preg_replace 替换它们。
$file_scan = fopen($directory.$file, "r");
if ($file_scan) {
while (($line = fgets($file_scan)) !== false) {
if(preg_match_all('/\%%(.*?)\%%/', $line, $matches)){
foreach($matches as $match){
foreach($match as $m){
$repair = preg_replace('/\%%(.*?)\%%/', $m, $m);
if(preg_match('/\%%(.*?)\%%/', $m, $m)){
} else {
echo $repair.' '.$j;
$j++;
}
}
$lines[$i] = preg_replace('/\%%(.*?)\%%/', constant($repair), $line);
}
} else {
$lines[$i] = $line;
}
$i++;
}
$template[$name] = implode("", $lines);
fclose($file_scan);
}
这段代码不能做的是在一行中查找和替换多个匹配项。例如,如果有一行:
<img src="%%LOGO_IMAGE%%"><h1>%%TITLE%%</h1>
以上代码将用相同的值 (TITLE) 替换两个项目。它还会在第一个循环中给出错误 couldn't find constant,但在第二个循环中可以正常工作。
这种情况很少发生,但我只是想知道如何在一行中修改多个实例以确保安全。
编辑:
我可以用这个替换大部分代码:
$file_scan = fopen($directory.$file, "r");
if ($file_scan) {
while (($line = fgets($file_scan)) !== false) {
$line = preg_replace('/\%%(.*?)\%%/', ''.'', $line);
echo $line;
}
fclose($file_scan);
我的最后一个问题是将替换项更改为常量。这可能吗?
最终编辑:
在 Peter Bowers 的建议的帮助下,我使用 preg_replace_callback 添加了将关键字更改为常量的能力:
foreach($filenames as $file){
$name = str_replace('.html', '', $file);
$template[$name] = preg_replace_callback('/\%%(.*?)\%%/', function($matches){
$matches[0] = preg_replace('/\%%(.*?)\%%/', '', $matches[0]);
return constant($matches[0]);
}, file_get_contents($directory.$file));
}
return $template;
这是一个更简单的实现。
$file_scan = fopen($directory.$file, "r");
if ($file_scan) {
$out = '';
while (($line = fgets($file_scan)) !== false) {
$out .= preg_replace('/\%%(.*?)\%%/', '', $line);
$i++;
}
$template[$name] = $out;
fclose($file_scan);
}
或者,更简单:
$str = file_get_contents($directory.$file);
$template[$name] = preg_replace('/\%%(.*?)\%%/', '', $str);
而且,由于我们在这里完全简单...
$template[$name] = preg_replace('/\%%(.*?)\%%/', '', file_get_contents($directory.$file));
(显然,当我们接近单行代码时,您正在失去一些错误检查功能,但是 - 嘿 - 我玩得很开心...... :-)
试试这个:
<?php
define('TITLE', 'Title');
define('LOGO_IMAGE', 'Image');
$lines = array();
$file_scan = fopen($directory.$file, "r");
if ($file_scan) {
while (($line = fgets($file_scan)) !== false) {
if(preg_match_all('/\%%(.*?)\%%/', $line, $matches)){
for($i = 0; $i < count($matches[0]); $i++) {
$line = str_replace($matches[0][$i], constant($matches[1][$i]), $line);
}
$lines[] = $line;
print_r($line);
}
}
}
$template[$name] = implode("", $lines);
fclose($file_scan);
?>
我有一个问题,我需要搜索 HTML page/snippet 并替换四个百分位符号之间的任何值并转换为常数变量,例如%%THIS_CONSTANT%% 变为 THIS_CONSTANT。
现在我正在逐行搜索页面,我能够找到匹配项并使用 preg_match_all 和 preg_replace 替换它们。
$file_scan = fopen($directory.$file, "r");
if ($file_scan) {
while (($line = fgets($file_scan)) !== false) {
if(preg_match_all('/\%%(.*?)\%%/', $line, $matches)){
foreach($matches as $match){
foreach($match as $m){
$repair = preg_replace('/\%%(.*?)\%%/', $m, $m);
if(preg_match('/\%%(.*?)\%%/', $m, $m)){
} else {
echo $repair.' '.$j;
$j++;
}
}
$lines[$i] = preg_replace('/\%%(.*?)\%%/', constant($repair), $line);
}
} else {
$lines[$i] = $line;
}
$i++;
}
$template[$name] = implode("", $lines);
fclose($file_scan);
}
这段代码不能做的是在一行中查找和替换多个匹配项。例如,如果有一行:
<img src="%%LOGO_IMAGE%%"><h1>%%TITLE%%</h1>
以上代码将用相同的值 (TITLE) 替换两个项目。它还会在第一个循环中给出错误 couldn't find constant,但在第二个循环中可以正常工作。
这种情况很少发生,但我只是想知道如何在一行中修改多个实例以确保安全。
编辑:
我可以用这个替换大部分代码:
$file_scan = fopen($directory.$file, "r");
if ($file_scan) {
while (($line = fgets($file_scan)) !== false) {
$line = preg_replace('/\%%(.*?)\%%/', ''.'', $line);
echo $line;
}
fclose($file_scan);
我的最后一个问题是将替换项更改为常量。这可能吗?
最终编辑:
在 Peter Bowers 的建议的帮助下,我使用 preg_replace_callback 添加了将关键字更改为常量的能力:
foreach($filenames as $file){
$name = str_replace('.html', '', $file);
$template[$name] = preg_replace_callback('/\%%(.*?)\%%/', function($matches){
$matches[0] = preg_replace('/\%%(.*?)\%%/', '', $matches[0]);
return constant($matches[0]);
}, file_get_contents($directory.$file));
}
return $template;
这是一个更简单的实现。
$file_scan = fopen($directory.$file, "r");
if ($file_scan) {
$out = '';
while (($line = fgets($file_scan)) !== false) {
$out .= preg_replace('/\%%(.*?)\%%/', '', $line);
$i++;
}
$template[$name] = $out;
fclose($file_scan);
}
或者,更简单:
$str = file_get_contents($directory.$file);
$template[$name] = preg_replace('/\%%(.*?)\%%/', '', $str);
而且,由于我们在这里完全简单...
$template[$name] = preg_replace('/\%%(.*?)\%%/', '', file_get_contents($directory.$file));
(显然,当我们接近单行代码时,您正在失去一些错误检查功能,但是 - 嘿 - 我玩得很开心...... :-)
试试这个:
<?php
define('TITLE', 'Title');
define('LOGO_IMAGE', 'Image');
$lines = array();
$file_scan = fopen($directory.$file, "r");
if ($file_scan) {
while (($line = fgets($file_scan)) !== false) {
if(preg_match_all('/\%%(.*?)\%%/', $line, $matches)){
for($i = 0; $i < count($matches[0]); $i++) {
$line = str_replace($matches[0][$i], constant($matches[1][$i]), $line);
}
$lines[] = $line;
print_r($line);
}
}
}
$template[$name] = implode("", $lines);
fclose($file_scan);
?>