在下划线之前或之后提取子字符串

时间:2017-05-05 04:43:48

标签: php regex string substring preg-match-all

我尝试使用preg_match_all()函数在_之后搜索字符串。我想要的输出是reset,text,email。我尝试使用regexr编辑器进行制作,并且能够使用[_]+[a-z]*进行制作,但这包括_reset, _text, _text。字符串将是:

$str = 'button_reset,location_text,email_text';

预期输出:

reset
text
email

2 个答案:

答案 0 :(得分:3)

正则表达式: /\_\K[a-zA-Z0-9]+

  

1。 \_\K这将匹配_\K将重置整场比赛。

     

2。 [a-zA-Z0-9]+将匹配所有这些字符

Try this code snippet here

<?php

ini_set('display_errors', 1);
$str = 'button_reset,location_text,email_text';
preg_match_all("/\_\K[a-zA-Z0-9]+/",$str,$matches);
print_r($matches);

<强>输出:

Array
(
    [0] => Array
        (
            [0] => reset
            [1] => text
            [2] => text
        )
)

答案 1 :(得分:2)

最好避免使用正则表达式完成此任务,只需使用str_replace()

输入:

$str = 'button_reset,location_text,email_text';

输出为数组的代码:

var_export(explode(',',str_replace(['button_reset','location_text','email_text'],['reset','text','email'],$str)));
// array (
//    0 => 'reset',
//    1 => 'text',
//    2 => 'email',
// )

或者,如果你坚持,正则表达式(Demo Link):

/button_\K[^,]+|,location_\K[^,]+|,\K[^_]+(?=_text)/

正则表达式细分:

button_\K[^,]+     #Match one or more non-comma-characters after button_
|                  #or
,location_\K[^,]+  #Match one or more non-comma-characters after location_
|                  #or
,\K[^_]+(?=_text)  #Match one or more non-underscore-characters that are
                   # immediately followed by _textafter button_

每个条件表达式中的\K表示从这一点开始匹配,并且有效地消除了在这种情况下使用捕获组的需要。 使用捕获组时,preg_match_all()会创建多个子阵列 - 一个填充全字符串匹配,另外一个填充捕获值。 应尽可能使用\K,因为它会将阵列大小减少多达50%。

代码:

$array=preg_match_all('/button_\K[^,]+|,location_\K[^,]+|,\K[^_]+(?=_text)/',$str,$out)?$out[0]:[];
var_export($array);

相同的输出:

array ( 0 => 'reset', 1 => 'text', 2 => 'email', )