Как удалить определенные символы строки в PHP? - PullRequest
1 голос
/ 30 сентября 2019

Допустим, у меня есть строка $ msg ниже:

$msg = '$hello , ken (JX02), Your Orders $invoiceno has been delivered. Thank you.';

Затем я буду искать переменные, которые я определил ранее, если да, я заменю из строки.

$hello = "morning!";
$msg = str_replace( '$hello' ,$hello,$msg);

, что даст мне:

morning! , ken (JX02), Your Orders $invoiceno has been delivered. Thank you.

Это нормально. Но если переменная не определена, я хочу удалить ее из строки $ msg. Допустим, я не определил $ invoiceno, тогда:

morning! , ken (JX02), Your Orders has been delivered. Thank you.

Поскольку имя переменной не фиксировано и вводится пользователем динамически, то как я могу достичь этой функции?

Ответы [ 5 ]

1 голос
/ 30 сентября 2019

Не знаете, это лучший способ или нет? но вы можете сделать это,

<?php
$msg = '$hello , ken (JX02), Your Orders $invoiceno has been delivered. Thank you.';
$hello = "morning!";
$msg = isset($hello) ? str_replace( '$hello' , $hello, $msg): str_replace( '$hello' , "", $msg);
$msg = isset($invoiceno) ? str_replace( '$invoiceno' , $invoiceno, $msg): str_replace( '$invoiceno' , "", $msg);
echo str_replace("  ", " ", $msg);;
?>

РАБОЧАЯ ДЕМО: https://3v4l.org/GL5RO

0 голосов
/ 30 сентября 2019

Лично для шаблонных строк я бы использовал что-то вроде {{ variable }} против $, так как любое забывание ' над " вызовет проблемы / путаницу, затем вы можете использовать простую строку вроде:

'{{ hello }}, ken (JX02), Your Orders {{ invoiceno }} has been delivered. Thank you.'

и регулярное выражение типа /{{[ ]{0,}([\w\_-]{1,})[ ]{0,}}}/ для сопоставления между заполнителями, затем выберите / установите из набора замен.

Чтобы включить эту идею в использование $можно выполнить следующее, которое будет анализировать переменные, заменять (из массива замен или локальных переменных (ранее заданных):

<?php
$hello = 'Hi'; // gets replaced (in $replacements)
$name = 'ken'; // gets replaced (in $GLOBALS)

//  
$replacements = [
  'hello' => 'morning',
  'invoiceno' => 1234
];

$msg = '$hello, $name (JX02), Your Orders $invoiceno has been delivered. $test $123,99 $123.99 Thank you.';

$result = preg_replace_callback('/\$([\w\_-]{1,})/', function ($match) use ($replacements) {
    return array_key_exists($match[1], $replacements) ? $replacements[$match[1]] : (
      isset($GLOBALS[$match[1]]) ? $GLOBALS[$match[1]] : '$'.$match[1]
    );
}, $msg);

echo $result; // morning, ken (JX02), Your Orders 1234 has been delivered. $test $123,99 $123.99 Thank you.

Рабочий пример:

https://3v4l.org/UMs9h

0 голосов
/ 30 сентября 2019

Наконец-то я нашел решение. Сначала замените все переменные, которые я установил.

Затем найдите все слова, начинающиеся со знака доллара, затем взорвите его, затем удалите первую строку каждого элемента массива. Наконец, объедините их обратно в строку.

    $new_msg = explode("$",$new_msg);
    $str = '';
    if(count($new_msg) > 0){
        foreach($new_msg as $k => $m){
            if($k > 0){
                $new_msg[$k] = substr(strstr($new_msg[$k]," "), 1);
            }

            $str .= $new_msg[$k];
        }
    }

    $new_msg = $str;
0 голосов
/ 30 сентября 2019

Вы можете использовать регулярное выражение, чтобы получить все имена переменных в массиве, заполнить его значением или ничем и заменить функцией strtr

$hello = "morning!";
$msg = '$hello , ken (JX02), Your Orders $invoiceno has been delivered. Thank you.';

preg_match_all('/\$(\w+)/', $msg, $m);

$keys = array_fill_keys($m[1], '');

foreach($keys as $k=>&$v) {
    if(isset($$k)) $v = $$k;
}

echo strtr($msg, $keys);

demo

0 голосов
/ 30 сентября 2019

Вы можете использовать строки в двойных кавычках для автоматической вставки содержимого переменной в строку.

$hello = 'Testname';
$msg = "$hello - your order is ready!";
echo $msg;

Вывод:

Testname - your order is ready!

Вы также можете использовать более сложные переменные, такие какс индексом, добавив {} вокруг него.

$customer['first_name'] = 'Tester';
$msg = "{$customer['first_name']}, your order is ready!";
echo $msg;

Вывод:

Tester, your order is ready!

Если переменная не определена, она выдаст E_NOTICE в php и ничего не напечатает в своемplace.

$msg = "$undefinedvariable, your order is ready!";
echo $msg;

Вывод:

, your order is ready!

Примечание: неопределенная переменная: undefinedvariable в myscript.php в строке 1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...