使用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;
}
该函数有一些我目前无法解决的问题。 :(
你能引导我出路吗?
答案 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
的第三个参数中。.
*?
?
是惰性匹配,因为%%
字符将与.
匹配。查看运行中的RegEx:https://regex101.com/r/qztLue/1