我找不到使用搜索的解决方案。
我正在寻找一个php解决方案,以便在第二次出现和下划线(包括下划线)之前删除所有字符
例如:
this_is_a_test
应输出为:
a_test
我目前有这段代码,但它会在第一次出现后删除所有内容:
preg_replace('/^[^_]*.s*/', '$1', 'this_is_a_test');
答案 0 :(得分:3)
preg_replace('/^.*_.*_(.*)$/U', '$1', 'this_is_a_test');
请注意U
修饰符,该修饰符告诉正则表达式尽可能减少.*
的字符数。
答案 1 :(得分:1)
您还可以使用explode
,implode
和array_splice
一样使用
$str = "this_is_a_test";
echo implode('_',array_splice(explode('_',$str),2));//a_test
答案 2 :(得分:1)
使用略有不同的方法,
$s='this_is_a_test';
echo implode('_', array_slice( explode( '_', $s ),2 ) );
/* outputs */
a_test
答案 3 :(得分:0)
为什么走复杂的道路?这是一个建议,但使用strrpos
和substr
:
<?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];
?>
答案 5 :(得分:0)
在这种情况下,我仍然支持正则表达式:
preg_replace('/^.*?_.*?_/', '', 'this_is_a_test');
或者(这里看起来更复杂但很容易调整为N..M下划线):
preg_replace('/^(?:.*?_){2}/', '', 'this_is_a_test');
在.*?
中使用问号会使比赛变得非贪婪;并且模式已从原始帖子扩展到&#34;匹配到#34;第二个下划线。
由于目标是删除文本,匹配的部分只需用空字符串替换 - 不需要捕获组或使用替换值等。
如果输入中没有包含两个下划线,则不会删除任何内容;如果规则得到进一步澄清,可以使用第二个正则表达式轻松调整。