我尝试使用preg_match_all()
函数在_
之后搜索字符串。我想要的输出是reset,text,email
。我尝试使用regexr编辑器进行制作,并且能够使用[_]+[a-z]*
进行制作,但这包括_reset, _text, _text
。字符串将是:
$str = 'button_reset,location_text,email_text';
预期输出:
reset
text
email
答案 0 :(得分:3)
正则表达式: /\_\K[a-zA-Z0-9]+
1。
\_\K
这将匹配_
,\K
将重置整场比赛。2。
[a-zA-Z0-9]+
将匹配所有这些字符
<?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', )