如何在PHP中用密钥内容未知的动态字符串str_replace部分

时间:2019-02-14 09:46:35

标签: php regex str-replace

使用WordPress(PHP)。我想将字符串设置为如下所示的数据库。该字符串是可翻译的,因此可以使用任何保留模板代码的语言。对于可能的变化,我在这里提供了4个字符串:

<?php
$string = '%%AUTHOR%% changed status to %%STATUS_new%%';
$string = '%%AUTHOR%% changed status to %%STATUS_oldie%%';
$string = '%%AUTHOR%% changed priority to %%PRIORITY_high%%';
$string = '%%AUTHOR%% changed priority to %%PRIORITY_low%%';

要使字符串易于阅读,对于%%AUTHOR%%部分,我可以按如下所示更改字符串:

<?php
$username = 'Illigil Liosous'; // could be any unicode string
$content = str_replace('%%AUTHOR%%', $username, $string);

但是对于状态和优先级,我有不同长度的不同子字符串。

问题是:
我该如何动态地替换那些动态子字符串,以便它们可以被人类阅读,例如:

  

Illigil Liosous的身份更改为新内膜;
  Illigil Liosous的身份更改为Oldisticabulous;
  Illigil Liosous将优先级更改为Highlistacolisticosso;
  Illigil Liosous将优先级更改为Lowisdulousiannosso;

那些难以听见的单词是为了让您了解可翻译字符串的性质,除了已知单词以外,其他任何单词都可以。

我想我可以继续进行以下操作:

<?php
if( strpos($_content, '%%STATUS_') !== false ) {
    // proceed to push the translatable status string
}
if( strpos($_content, '%%PRIORITY_') !== false ) {
    // proceed to push the translatable priority string
}

但是我如何有效地填充这些条件呢?

编辑

我可能不太清楚我的问题,因此更新了查询。该问题与数组str_replace无关。

问题是,我需要检测的$string尚未预定义。它将如下所示:

if($status_changed) :
    $string = "%%AUTHOR%% changed status to %%STATUS_{$status}%%";
else if($priority_changed) :
    $string = "%%AUTHOR%% changed priority to %%PRIORITY_{$priority}%%";
endif;

将在其中用$status$priority中的值动态填充它们。

因此,对于str_replace(),我实际上将使用函数来获取其相应的标签:

<?php
function human_readable($codified_string, $user_id) {

    if( strpos($_content, '%%STATUS_') !== false ) {
        // need a way to get the $status extracted from the $codified_string
        // $_got_status = ???? // I don't know how.
        get_status_label($_got_status);
        // the status label replacement would take place here, I don't know how.
    }

    if( strpos($_content, '%%PRIORITY_') !== false ) {
        // need a way to get the $priority extracted from the $codified_string
        // $_got_priority = ???? // I don't know how.
        get_priority_label($_got_priority);
        // the priority label replacement would take place here, I don't know how.
    }

    // Author name replacement takes place now
    $username = get_the_username($user_id);
    $human_readable_string = str_replace('%%AUTHOR%%', $username, $codified_string);

    return $human_readable_string;

}

该函数有一些我目前无法解决的问题。 :(

你能引导我出路吗?

1 个答案:

答案 0 :(得分:1)

听起来您需要为此解决方案使用RegEx。
您可以使用以下代码片段来获得想要的效果:

preg_match('/%%PRIORITY_(.*?)%%/', $_content, $matches);
if (count($matches) > 0) {
    $human_readable_string = str_replace("%%PRIORITY_{$matches[0]}%%", $replace, $codified_string);
}

当然,STATUS和您需要的任何其他替换项都需要更改以上代码。

简述RegEx代码:

  • /
    任何正则表达式的开始。
  • %%PRIORITY_
    是这些字符的字面匹配。
  • (
    比赛开幕。这将存储在preg_match的第三个参数中。
  • .
    这会匹配不是换行符的任何字符。
  • *?
    它在0到前一个字符的无限个之间匹配-在这种情况下为任何?是惰性匹配,因为%%字符将与.匹配。

查看运行中的RegEx:https://regex101.com/r/qztLue/1