Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 避免可能使用正则表达式的语句_Php_Regex - Fatal编程技术网

Php 避免可能使用正则表达式的语句

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/某物/其他/

如何在正则表达式出现第一次斜杠之前用避免年份数字(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/某物/其他/


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-]*/)
    断言存在
    /
  • [a-zA-Z013-9-]+
    将列出的任何一项匹配1+次(注意,2项未列出)
  • (?>
    原子群
    • 2(?!0(?:19 | 20)(?!\d))
      匹配2并断言右边的不是019或020
    • |
    • [a-zA-Z013-9-]+
      将列出的任何一项匹配1+次
  • )*
    关闭分组并重复0多次
  • /?
    匹配可选
    /
|

您的代码可能看起来像

preg_replace('~^(?=[a-z\d-]*/)[a-zA-Z013-9-]+(?>2(?!0(?:19|20)(?!\d))|[a-zA-Z013-9-]+)*/?~', '', $input_lines);

通常是这样做的