2015-09-12 51 views
0

我找不到使用搜索的解决方案。如何在第二次出现下划线之前删除所有内容

我寻找一个PHP溶液以除去所有的字符的第二次数BEFORE和下划线(包括下划线)

例如:

this_is_a_test

应该输出为:

a_test

目前,我有这个代码,但第一次出现后,它会删除一切:

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

回答

1

使用略有不同的方法,

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

/* outputs */ 
a_test 
+0

这看起来最优雅的所有解决方案。谢谢! – user3436467

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

注意U修改它告诉正则表达式来承担,作为.*尽可能少的字符。

+0

这是有效的,你是第一个回应。谢谢! – user3436467

1

您还可以使用explodeimplode随着array_splice等作为

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

Demo

+0

谢谢,这似乎是最容易理解的 – user3436467

0

为什么走复杂的方式?这虽然是使用strrpossubstr建议:

<?php 
$str = "this_is_a_test"; 

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

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

试试这一个。

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

Demo

0

我还是赞成在这种情况下,正则表达式:

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

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

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

使用.*?中的问号使得匹配非贪婪;和这个模式已经从原来的帖子扩展到“匹配”第二个下划线

由于目标是删除文本匹配的部分被简单地替换为空字符串 - 不需要捕获组或使用诸如重置值。

如果输入不包含两个下划线,则不会删除任何内容;如果规则得到进一步澄清,可以使用第二个正则表达式很容易地调整这些值。

相关问题