用PHP函数替换XML文件中的占位符

用PHP函数替换XML文件中的占位符,php,xml,Php,Xml,我有一个包含FAQ的XML文件,但是答案的一些内容需要使用PHP函数来输出适当的内容 如何在答案中找到占位符,并用PHP函数替换它们?理想情况下,我希望能够将函数设置为可在多个网站上更改的变量,这段代码将在多个网站上使用 XML文件(最后一个块中的占位符,%LOCAL\u NO%和%PREM\u NO%) 一般的 我需要多大年纪才能使用你的服务? 您必须至少年满18岁。 一般的 通灵阅读需要多长时间? 通灵阅读的长度完全取决于你。这取决于你所问问题的数量和复杂性。阅读的平均时间为15到20分钟

我有一个包含FAQ的XML文件,但是答案的一些内容需要使用PHP函数来输出适当的内容

如何在答案中找到占位符,并用PHP函数替换它们?理想情况下,我希望能够将函数设置为可在多个网站上更改的变量,这段代码将在多个网站上使用

XML文件(最后一个块中的占位符,%LOCAL\u NO%和%PREM\u NO%)


一般的
我需要多大年纪才能使用你的服务?
您必须至少年满18岁。
一般的
通灵阅读需要多长时间?
通灵阅读的长度完全取决于你。这取决于你所问问题的数量和复杂性。阅读的平均时间为15到20分钟。
一般的
我可以选择和我说话的通灵者吗?
当然您可以通过选择您想要的通灵师的个人资料并通过在线预订页面按照在线提示进行选择,或致电%PREM_NO%并输入其PIN,或致电%LOCAL_NO%,我们的现场接待员将为您连接符合您要求的通灵师!
PHP输出

<?php // General FAQs
$faqGeneral = $xml->xpath("/faqs/faq[category='General']");
echo "<h2>General</h2>";
foreach ($faqGeneral as $faq) { ?>
    <h3><?php echo $faq->q; ?></h3>
    <p><?php echo $faq->a; ?></p>
<?php } ?>

如果您知道要匹配的字符串和之前的值(即,非动态),那么您可以执行
str_replace
内联操作

如果它们是动态的,那么您可以从数据库(或存储它们的任何位置)获取值,然后循环并替换它们

或者,您可以使用regex,类似于
/(\%[a-z\]+\%)/i
。为此,您可以查看
preg\u match\u all


更新:您可以使用数组作为
str\u replace
的参数。例如:

$find = array('%PREM_NO%', '%LOCAL_NO%');
$replace = array('012345', '67890');

$answer = str_replace($find, $replace, $faq->a);

如果您知道要匹配的字符串和之前的值(即,非动态),那么您可以执行
str\u replace
inline

如果它们是动态的,那么您可以从数据库(或存储它们的任何位置)获取值,然后循环并替换它们

或者,您可以使用regex,类似于
/(\%[a-z\]+\%)/i
。为此,您可以查看
preg\u match\u all


更新:您可以使用数组作为
str\u replace
的参数。例如:

$find = array('%PREM_NO%', '%LOCAL_NO%');
$replace = array('012345', '67890');

$answer = str_replace($find, $replace, $faq->a);

如果您知道要匹配的字符串和之前的值(即,非动态),那么您可以执行
str\u replace
inline

如果它们是动态的,那么您可以从数据库(或存储它们的任何位置)获取值,然后循环并替换它们

或者,您可以使用regex,类似于
/(\%[a-z\]+\%)/i
。为此,您可以查看
preg\u match\u all


更新:您可以使用数组作为
str\u replace
的参数。例如:

$find = array('%PREM_NO%', '%LOCAL_NO%');
$replace = array('012345', '67890');

$answer = str_replace($find, $replace, $faq->a);

如果您知道要匹配的字符串和之前的值(即,非动态),那么您可以执行
str\u replace
inline

如果它们是动态的,那么您可以从数据库(或存储它们的任何位置)获取值,然后循环并替换它们

或者,您可以使用regex,类似于
/(\%[a-z\]+\%)/i
。为此,您可以查看
preg\u match\u all


更新:您可以使用数组作为
str\u replace
的参数。例如:

$find = array('%PREM_NO%', '%LOCAL_NO%');
$replace = array('012345', '67890');

$answer = str_replace($find, $replace, $faq->a);

这看起来像是
preg\u replace\u callback
的例子,当然在计算XML之前称为。这也确保了“PHP回音”值不会破坏XML语法

$data = array(
    'tags' => array(
        'PREM_NO'   => '1-800-CSICOP',
    )
);

$filledXML = preg_replace_callback(
    '#%(\\w+)%#', // A-Z and underscore between %%'s
    function ($matches) use ($data) {
        switch($matches[1]) {
            case 'PREM_NO':
            case 'WHATEVER':
                return $data['tags'][$matches[1]];
            case 'YYYYMMDD':
                return date('Y-m-d');
            default:
                return '';
        }
    },
    $xmlString);

// $xml = loadXML($xmlString);
$xml = loadXML($filledXML);
这允许特殊标记(如YYYYMMDD)返回运行时计算值以及外部值。您甚至可以在$data中包含一个PDO句柄,并能够在函数中运行SQL查询

更简单的版本
这看起来像是
preg\u replace\u callback
的例子,当然在计算XML之前称为。这也确保了“PHP回音”值不会破坏XML语法

$data = array(
    'tags' => array(
        'PREM_NO'   => '1-800-CSICOP',
    )
);

$filledXML = preg_replace_callback(
    '#%(\\w+)%#', // A-Z and underscore between %%'s
    function ($matches) use ($data) {
        switch($matches[1]) {
            case 'PREM_NO':
            case 'WHATEVER':
                return $data['tags'][$matches[1]];
            case 'YYYYMMDD':
                return date('Y-m-d');
            default:
                return '';
        }
    },
    $xmlString);

// $xml = loadXML($xmlString);
$xml = loadXML($filledXML);
这允许特殊标记(如YYYYMMDD)返回运行时计算值以及外部值。您甚至可以在$data中包含一个PDO句柄,并能够在函数中运行SQL查询

更简单的版本
这看起来像是
preg\u replace\u callback
的例子,当然在计算XML之前称为。这也确保了“PHP回音”值不会破坏XML语法

$data = array(
    'tags' => array(
        'PREM_NO'   => '1-800-CSICOP',
    )
);

$filledXML = preg_replace_callback(
    '#%(\\w+)%#', // A-Z and underscore between %%'s
    function ($matches) use ($data) {
        switch($matches[1]) {
            case 'PREM_NO':
            case 'WHATEVER':
                return $data['tags'][$matches[1]];
            case 'YYYYMMDD':
                return date('Y-m-d');
            default:
                return '';
        }
    },
    $xmlString);

// $xml = loadXML($xmlString);
$xml = loadXML($filledXML);
这允许特殊标记(如YYYYMMDD)返回运行时计算值以及外部值。您甚至可以在$data中包含一个PDO句柄,并能够在函数中运行SQL查询

更简单的版本
这看起来像是
preg\u replace\u callback
的例子,当然在计算XML之前称为。这也确保了“PHP回音”值不会破坏XML语法

$data = array(
    'tags' => array(
        'PREM_NO'   => '1-800-CSICOP',
    )
);

$filledXML = preg_replace_callback(
    '#%(\\w+)%#', // A-Z and underscore between %%'s
    function ($matches) use ($data) {
        switch($matches[1]) {
            case 'PREM_NO':
            case 'WHATEVER':
                return $data['tags'][$matches[1]];
            case 'YYYYMMDD':
                return date('Y-m-d');
            default:
                return '';
        }
    },
    $xmlString);

// $xml = loadXML($xmlString);
$xml = loadXML($filledXML);
这允许特殊标记(如YYYYMMDD)返回运行时计算值以及外部值。您甚至可以在$data中包含一个PDO句柄,并能够在函数中运行SQL查询

更简单的版本
我正在寻找一些简单的东西,这看起来太深入了。我不确定你在第一个解决方案中试图用正则表达式做什么。我认为
%\w+%
会(或者PHP中的
%\\w+%\
),你可以使用
stru\u replace
(在简单的情况下应该更快-我记得几个月前在这里运行了一些基准测试)。然而,对于少量的替换,速度差异无关紧要。@funkworm,你可能是对的-我不记得\w中是否包含u。但是,您确实希望捕获匹配项并去掉%,因此至少它是
%(\\w+)%
。另一方面,是的,可以捕获