通过最后一个大写字母查找所有出现的$

时间:2015-12-30 07:12:56

标签: php regex

我在尝试查找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更具挑战性,因为其余部分不是变量的一部分。

所有变量都假设以$开头并且都是大写字母。

我正在寻找一种方法来查找以$开头然后通过最后一个大写字母的子字符串。

想法?

3 个答案:

答案 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
)