【问题标题】:How to remove specific characters string in PHP?如何删除PHP中的特定字符串?
【发布时间】:2019-09-30 08:38:55
【问题描述】:

假设我在下面有一个字符串 $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.

既然变量名不是固定的,是用户动态输入的,那么如何实现这个功能呢?

【问题讨论】:

  • 你如何决定什么是变量名,什么不是?如果您只是使用前面的 $ 来决定,请先进行所有变量替换,然后删除所有以美元符号开头的单词。你知道如果你在你的第一个代码块中使用双引号包围字符串赋值,PHP 会为你做所有的变量名/值替换,对吧?
  • 我已经处理了所有变量替换,主要问题是如何删除任何以美元符号开头且未从我的程序中定义的单词(应用类似 isset.. 之类的东西..)跨度>
  • 一种方法是将explode 最终字符串放入一个数组中,向下扫描每个元素并检查您的条件,然后从数组中删除单词并在最后使用implode,或者只是在循环时构建字符串。事实上,您可以在整个操作中这样做。
  • 快速注意:如果$hello 没有设置,你仍然会在开头使用那个逗号。如果$invoiceno 未设置,而您在控制台上打印该字符串,则会留下两个空格。

标签: php variables syntax


【解决方案1】:

您可以使用双引号字符串将变量的内容自动插入到字符串中。

$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!

如果变量未定义,它将在 php 中抛出一个 E_NOTICE 并且不会在其位置打印任何内容。

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

输出:

, your order is ready!

注意:未定义变量:myscript.php 第 1 行中的未定义变量

【讨论】:

  • 如果我没有定义 $hello 并且不想在我的 $msg 中显示 $hello 怎么办?
  • 如果您在一小段代码中尝试这样做会发生什么?你得到了什么? (我不记得了,我认为它只会在字符串中留下未替换的名称,但不尝试不知道。)
  • @droopsnoot 注意:未定义变量:invoiceno
  • 添加了一些说明
  • 好的,如果你得到一个错误,那告诉你你不能那样做。
【解决方案2】:

不知道这是不是最好的方法?但你可以这样做,

<?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

【讨论】:

  • 这里的问题是它只有在你知道所有变量名的情况下才有效。 OP说他们没有。
  • 我可以修复脚本以使其成为动态变量或为消费者使用数组,但我做了静态以使 OP 更容易
【解决方案3】:

最后,我找到了解决方案。首先,替换我设置的所有变量。

然后,找出每个以美元符号开头的单词,然后将其分解,然后删除数组中每个元素的第一个字符串。最后,将它们组合成一个字符串。

    $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;

【讨论】:

  • 这不是我的意思,但如果它给你所需的结果,那就太好了。我会用一个空格爆炸,然后遍历每个单词,如果它以$ 开头,那么要么输入变量值(如果存在)或什么都不输入(如果不存在),然后将其附加到您的字符串。
【解决方案4】:

您可以使用正则表达式将所有变量名放入数组中,用值或空填充,然后用 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

【讨论】:

    【解决方案5】:

    就个人而言,对于模板字符串,我会使用 {{ 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-24
      • 1970-01-01
      • 1970-01-01
      • 2012-05-30
      • 2011-01-04
      • 2016-08-25
      相关资源
      最近更新 更多