【问题标题】:PHP - How to splice a string at a certain character?PHP - 如何在某个字符处拼接字符串?
【发布时间】:2017-03-15 23:23:43
【问题描述】:

我想创建一个函数,从冒号后面的文件中获取每一行。我无法在所述字符处分割字符串。

所以我想切片:

“日期:2017 年 3 月 27 日”至“2017 年 3 月 27 日” “开始:12:30pm”到“12:30pm”......等等。

注意:我不需要帮助编写实际函数,我只是想知道如何在第一个冒号处拼接行

【问题讨论】:

  • 使用反引号封装代码、文件内容。您可以将strpossubstr 一起使用。
  • 不知道strpos,谢谢你的建议。我试试看!
  • @Jun 请更新标题和/或问题以指定您要删除的子字符串在原始字符串中不出现多次。因此,您的问题与stackoverflow.com/questions/4517067/… 不重复
  • @Jun 你能解释一下为什么你选择了 NishanthMatha 的解决方案而不是我的解决方案,它提供了 7 种不同的正确解决方案、文档参考和演示?如果是关于速度,他在我的帖子最后一次编辑后被更正/编辑。我对你的决定感到困惑。请帮助未来的 SO 读者找到您问题的最佳答案——这就是绿色勾号的含义。
  • @mickmackusa 大声笑你的评论让我很开心......我第一次看到有人强迫 OP 接受他们的回答 ;)

标签: php substring


【解决方案1】:

对于您的情况,使用:$string="date: march 27, 2017";$string="start: 12:30pm";

您可以选择以下任何一种技术:

*注意:如果担心针的存在(冒号冒号空间),那么您应该使用防伪选项之一,否则需要额外的考虑才能在没有针的情况下抓住绳子。

使用strpos() & substr() *防伪:

$string=($pos=strpos($string,": "))?substr($string,$pos+2):$string;

使用strstr() & substr() *防伪:

$string=($sub=strstr($string,": "))?substr($sub,2):$string;

使用explode() *需要冒号空间才能存在:

$string=explode(': ',$string,2)[1];

使用explode() & end() *不再是单行,而是防伪:

$array=explode(': ',$string,2);
$string=end($array);
// nesting explode() inside end() will yield the following notice:
// NOTICE Only variables should be passed by reference

使用preg_replace()a regex pattern *防伪:

$string=preg_replace("/(^.*?:\s)/","",$string);

使用preg_match()a regex pattern 不是单行的,而是防伪:

preg_match("/^.*?:\s(.*)/",$string,$captured);
$string=(sizeof($captured))?end($captured):$string;

使用str_replace() *不是单行,而是防伪:

$search=array("date: ","start: ");
$replace="";
$count=1;
$string=str_replace($search,$replace,$string,$count);

这里是Demo,供任何可能想在自己的雪花盒上运行一些测试的人使用。

【讨论】:

    【解决方案2】:

    正如@chris85 建议的那样,使用strpossubstr 的解决方案:

    $date = "date: march 27, 2017";
    $yourString = $date;
    //get the position of `:`
    if(strpos($date, ":")!==false) {
        //get substring    
        $yourString = substr($date, strpos($date, ":") + 1);    
    }
    echo $yourString;
    

    编辑

    根据@mickmackusa 评论,上述答案可能在提取的文本之前有尾随空格,您可以使用它:

    $yourString = ltrim($yourString)
    

    【讨论】:

    • 这个答案需要ltrim() 或类似的调整来删除新字符串中的前导空格。
    【解决方案3】:

    使用 strstr - http://php.net/manual/en/function.strstr.php

    应该喜欢接近的东西

    $str = 'date: march 27, 2017';
    $str = strstr($str, ':');
    $str = trim(substr($str, 1));
    
    var_dump($str);
    string(14) "march 27, 2017"
    

    尚未对其进行测试,但根据文档应该可以解决问题

    【讨论】:

    • strstr()的第三个参数默认为false,可以省略。
    • 此答案未能从新字符串的前面修剪空格,因此不符合简要说明。
    • 没有人说任何关于空白的事情,但是你去吧。
    • 注意细节。当您将"date: march 27, 2017" 更改为"march 27, 2017" 并将"start: 12:30pm" 更改为"12:30pm" 时,您必须删除第一个单词、冒号和空格。感谢您修复此问题,以便未来的 SO 读者可以从看到正确的解决方案中受益。
    【解决方案4】:

    这是一个简单的解决方案:

    var_dump(explode(':', "date: march 27, 2017", 2));
    

    这将输出以下内容:

    array(2) {
      [0]=>
      string(4) "date"
      [1]=>
      string(15) " march 27, 2017"
    }
    

    然后您在 [1] 索引中有值,并且在 [0] 索引中有起始值。如果需要,这将允许您执行其他逻辑。

    然后您可以对值调用 trim() 以删除任何空白。

    【讨论】:

    • 为什么不通过在colon AND space 上爆炸来保存最后的trim() 步骤,使元素[1] 立即可以使用?
    • 你总是肯定会有colon AND space吗?如果是这样,那么您可以在此基础上爆炸,而不仅仅是 colon
    • 我就是这么说的。这是一个建议。
    • 那么是的,如果你不在乎空间,你可以爆炸。
    【解决方案5】:

    你可以在:http://php.net/manual/en/function.explode.phpexplodehttp://php.net/manual/en/function.explode.php

    然后拼接数组http://php.net/array_splice

    并用implodehttp://php.net/manual/en/function.implode.php恢复字符串

    另见:How to splice an array to insert array at specific position?

    $x=explode(':',$string);
    array_splice($x, 1, 0, ['text_Added']);
    $string = implode($x);
    

    编辑:

    如果您只想删除 date: 从字符串中,您可以使用第二个参数作为过滤器对其进行修剪。http://php.net/manual/en/function.trim.php

    echo trim('date: march 27, 2017" to "march 27, 2017" "start: 12:30pm" to "12:30pm','date:');
    
    //march 27, 2017" to "march 27, 2017" "start: 12:30pm" to "12:30pm
    

    或者甚至只是 str_replace 它。使用第四个参数,1 在第一个替换后停止 http://php.net/manual/en/function.str-replace.php

    【讨论】:

    • 此技术不会从字符串的前面修剪子字符串。它还使用 3 个函数调用,其中至少有 6 种其他方法可以通过 2 个或更少的函数调用来实现请求的结果。
    • ...刚想起第七种方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    相关资源
    最近更新 更多