Php 避免可能使用正则表达式的语句
如何在正则表达式出现第一次斜杠之前用避免年份数字(f.e.2019或2019-2020)替换字符串的一部分Php 避免可能使用正则表达式的语句,php,regex,Php,Regex,如何在正则表达式出现第一次斜杠之前用避免年份数字(f.e.2019或2019-2020)替换字符串的一部分 //something is wrong here preg_replace('/^[a-z0-9\-]+(-20[0-9]{2}(-20[0-9]{2})?)?/', '$1', $input_lines); 需要: abc def/something/else/[如果前面没有字符,则包括斜杠] abc-def-2019/某物/其他/ abc-def-2019-2020/某物/其他/
//something is wrong here
preg_replace('/^[a-z0-9\-]+(-20[0-9]{2}(-20[0-9]{2})?)?/', '$1', $input_lines);
需要:
abc def/something/else/[如果前面没有字符,则包括斜杠]
abc-def-2019/某物/其他/
abc-def-2019-2020/某物/其他/
abc-def-125-2019/something/else/我的初始关闭不足以满足所有要求。是的,你有一个贪婪的量词问题,但还有更多的问题要处理 代码:()() 输出:
array (
0 => 'something/else/',
1 => '2019/something/else/',
2 => '2019-2020/something/else/',
3 => '2019/something/else/',
)
我的模式匹配字母数字序列,可以选择后面跟一个连字符——一个可能重复零次或多次的子模式(“回馈”,如果可能,也称为非贪婪)
然后,第一个非捕获组后面必须跟一个斜杠(匹配)或一个your year子字符串,该子字符串也可能有一个尾随连字符(不匹配,但通过lookahead查找)
如果这不适合您的实际项目数据,您将需要提供越来越精确的样本来测试,以显示边缘情况。如果必须存在正斜杠,并且在2019年或2020年第一次出现后应停止,您可以使用:
^(?=[a-z\d-]*/)[a-zA-Z013-9-]+(?>2(?!0(?:19|20)(?!\d))|[a-zA-Z013-9-]+)*/?
在看起来像
preg_replace('~^(?=[a-z\d-]*/)[a-zA-Z013-9-]+(?>2(?!0(?:19|20)(?!\d))|[a-zA-Z013-9-]+)*/?~', '', $input_lines);
字符串的开头^
断言存在(?=[a-z\d-]*/)
/
将列出的任何一项匹配1+次(注意,2项未列出)[a-zA-Z013-9-]+
原子群(?>
匹配2并断言右边的不是019或0202(?!0(?:19 | 20)(?!\d))
或|
将列出的任何一项匹配1+次[a-zA-Z013-9-]+
关闭分组并重复0多次)*
匹配可选/?
/
preg_replace('~^(?=[a-z\d-]*/)[a-zA-Z013-9-]+(?>2(?!0(?:19|20)(?!\d))|[a-zA-Z013-9-]+)*/?~', '', $input_lines);
通常是这样做的