我在尝试查找html文件中的所有变量时遇到问题。
HTML文件包含一个电子邮件模板,当电子邮件本身发出时,它会将“$ EMAIL_FIRST_NAME”等变量转换为“John”之类的内容,因为信息会发送到电子邮件功能以替换所有出现的“$ EMAIL_FIRST_NAME”与“约翰”。我遇到的问题是尝试帮助人们创建这些电子邮件模板。我想为他们提供插入测试数据的能力。
他们可以使用他们的电子邮件模板(在textarea中编辑)并使用jquery将其模板加载到新窗口中进行预览。我用它取代了一些“库存”字段。但是我遇到了能够添加测试数据的问题。
由于每个模板用于不同的目的,因此最好显示正确的字段。我正在寻找一种方法来使用PHP来浏览HTML模板并找到变量来编译数组(用于创建输入框)。
一些代码段例如:
<meta http-equiv="Content-Type" content="text/html; charset=$CHARSET">
$INTRO_ORDER_NUM_TITLE $INTRO_ORDER_NUMBER
$INTRO_DATE_TITLE $INTRO_DATE_ORDERED
<a href="$WEBSITE_ADDRESSindex.php?main_page=contact_us">$WEBSITE_ADDRESSindex.php?main_page=contact_us</a>
我正在寻找一种方法来给出这样的数组:
array('$CHARSET','$INTRO_ORDER_NUM_TITLE','$INTRO_ORDER_NUMBER','$INTRO_DATE_TITLE','$INTRO_DATE_ORDERED','$WEBSITE_ADDRESS')
其中一些我可以用空格爆炸,然后找到以$开头的那些。然而,其余的$ WEBSITE_ADDRESS更具挑战性,因为其余部分不是变量的一部分。
所有变量都假设以$开头并且都是大写字母。
我正在寻找一种方法来查找以$开头然后通过最后一个大写字母的子字符串。
想法?
答案 0 :(得分:1)
您可以使用以下表达式:\$[A-Z_]+
(示例here)查找以美元符号($
)开头的字符串,后跟一个或多个上部字符串大小写字母和下划线。
正如@Jan所指出的,你可以使用preg_replace_callback()
让代码在替换时做一些逻辑。
答案 1 :(得分:1)
除了npintis regex之外,这里还有一个带回调函数的例子。我会将$
符号更改为PHP不太复杂的内容(例如_
之前和之后):
<?php
$tmpl = '<meta http-equiv="Content-Type" content="text/html; charset=_CHARSET_">
_INTRO_ORDER_NUM_TITLE_ _INTRO_ORDER_NUMBER_
_INTRO_DATE_TITLE_ _INTRO_DATE_ORDERED_
<a href="_WEBSITE_ADDRESS_index.php?main_page=contact_us">_WEBSITE_ADDRESS_index.php?main_page=contact_us</a>';
$allowed = array('_CHARSET_','_INTRO_ORDER_NUM_TITLE_','_INTRO_ORDER_NUMBER_','_INTRO_DATE_TITLE_','_INTRO_DATE_ORDERED_','_WEBSITE_ADDRESS_');
$replacements = array("_CHARSET_" => "some stupid charset");
$regex = '~(?<variable>_[A-Z_]+)~';
$tmpl = preg_replace_callback(
$regex,
function ($match) {
global $allowed, $replacements;
$m = $match["variable"];
if (in_array($m, array_keys($allowed))) {
return $replacements[$m];
// or anything else
}
},
$tmpl
);
echo $tmpl;
// now you have a stupid charset ...
?>
答案 2 :(得分:1)
试试这个: -
$str = '<meta http-equiv="Content-Type" content="text/html; charset=$CHARSET">
$INTRO_ORDER_NUM_TITLE $INTRO_ORDER_NUMBER
$INTRO_DATE_TITLE $INTRO_DATE_ORDERED
<a href="$WEBSITE_ADDRESSindex.php?main_page=contact_us">$WEBSITE_ADDRESSindex.php?main_page=contact_us</a>';
$input = preg_match_all('/\$[A-Z_]+/', $str, $match);
$result = array_unique($match[0]);
echo '<pre>'; print_r($result);
输出: -
Array
(
[0] => $CHARSET
[1] => $INTRO_ORDER_NUM_TITLE
[2] => $INTRO_ORDER_NUMBER
[3] => $INTRO_DATE_TITLE
[4] => $INTRO_DATE_ORDERED
[5] => $WEBSITE_ADDRESS
)