如何在第二次出现下划线之前删除所有内容

时间:2015-09-12 07:39:47

标签: php

我找不到使用搜索的解决方案。

我正在寻找一个php解决方案,以便在第二次出现和下划线(包括下划线)之前删除所有字符

例如:

this_is_a_test

应输出为:

a_test

我目前有这段代码,但它会在第一次出现后删除所有内容:

preg_replace('/^[^_]*.s*/', '$1', 'this_is_a_test');

6 个答案:

答案 0 :(得分:3)

preg_replace('/^.*_.*_(.*)$/U', '$1', 'this_is_a_test');

请注意U修饰符,该修饰符告诉正则表达式尽可能减少.*的字符数。

答案 1 :(得分:1)

您还可以使用explodeimplodearray_splice一样使用

$str = "this_is_a_test";
echo implode('_',array_splice(explode('_',$str),2));//a_test

Demo

答案 2 :(得分:1)

使用略有不同的方法,

$s='this_is_a_test';
echo implode('_', array_slice( explode( '_', $s ),2 ) );

/* outputs */
a_test

答案 3 :(得分:0)

为什么走复杂的道路?这是一个建议,但使用strrpossubstr

<?php
$str = "this_is_a_test";

$str_pos = strrpos($str, "_");

echo substr($str, $str_pos-1);
?>

答案 4 :(得分:0)

试试这个。

<?php
    $string = 'this_is_a_test';
    $explode = explode('_', $string, 3);
    echo $explode[2];
?>

Demo

答案 5 :(得分:0)

在这种情况下,我仍然支持正则表达式:

preg_replace('/^.*?_.*?_/', '', 'this_is_a_test');

或者(这里看起来更复杂但很容易调整为N..M下划线):

preg_replace('/^(?:.*?_){2}/', '', 'this_is_a_test');

.*?中使用问号会使比赛变得非贪婪;并且模式已从原始帖子扩展到&#34;匹配到#34;第二个下划线

由于目标是删除文本,匹配的部分只需用空字符串替换 - 不需要捕获组或使用替换值等。

如果输入中没有包含两个下划线,则不会删除任何内容;如果规则得到进一步澄清,可以使用第二个正则表达式轻松调整。