我找不到使用搜索的解决方案。如何在第二次出现下划线之前删除所有内容
我寻找一个PHP溶液以除去所有的字符的第二次数BEFORE和下划线(包括下划线)
例如:
this_is_a_test
应该输出为:
a_test
目前,我有这个代码,但第一次出现后,它会删除一切:
preg_replace('/^[^_]*.s*/', '$1', 'this_is_a_test');
我找不到使用搜索的解决方案。如何在第二次出现下划线之前删除所有内容
我寻找一个PHP溶液以除去所有的字符的第二次数BEFORE和下划线(包括下划线)
例如:
this_is_a_test
应该输出为:
a_test
目前,我有这个代码,但第一次出现后,它会删除一切:
preg_replace('/^[^_]*.s*/', '$1', 'this_is_a_test');
使用略有不同的方法,
$s='this_is_a_test';
echo implode('_', array_slice(explode('_', $s),2));
/* outputs */
a_test
preg_replace('/^.*_.*_(.*)$/U', '$1', 'this_is_a_test');
注意U
修改它告诉正则表达式来承担,作为.*
尽可能少的字符。
这是有效的,你是第一个回应。谢谢! – user3436467
您还可以使用explode
,implode
随着array_splice
等作为
$str = "this_is_a_test";
echo implode('_',array_splice(explode('_',$str),2));//a_test
谢谢,这似乎是最容易理解的 – user3436467
为什么走复杂的方式?这虽然是使用strrpos
和substr
建议:
<?php
$str = "this_is_a_test";
$str_pos = strrpos($str, "_");
echo substr($str, $str_pos-1);
?>
试试这一个。
<?php
$string = 'this_is_a_test';
$explode = explode('_', $string, 3);
echo $explode[2];
?>
我还是赞成在这种情况下,正则表达式:
preg_replace('/^.*?_.*?_/', '', 'this_is_a_test');
或(看起来这里更复杂,但可以很容易地调整为N..M下划线):
preg_replace('/^(?:.*?_){2}/', '', 'this_is_a_test');
使用.*?
中的问号使得匹配非贪婪;和这个模式已经从原来的帖子扩展到“匹配”第二个下划线。
由于目标是删除文本匹配的部分被简单地替换为空字符串 - 不需要捕获组或使用诸如重置值。
如果输入不包含两个下划线,则不会删除任何内容;如果规则得到进一步澄清,可以使用第二个正则表达式很容易地调整这些值。
这看起来最优雅的所有解决方案。谢谢! – user3436467