Как я могу str_replace частично в PHP в динамической строке с неизвестным ключом содержимого - PullRequest
0 голосов
/ 14 февраля 2019

Работа в 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 изменил статус на Newendotobulous;
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 голосов
/ 20 февраля 2019

Похоже, вам нужно использовать 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

...