Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/291.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
Regex:PHP的变通方法&x27;s查看固定长度断言限制后面的内容_Php_Regex_Assert - Fatal编程技术网

Regex:PHP的变通方法&x27;s查看固定长度断言限制后面的内容

Regex:PHP的变通方法&x27;s查看固定长度断言限制后面的内容,php,regex,assert,Php,Regex,Assert,我试图更多地了解look-around断言,我发现,它们的解决方案应该在某些引擎中工作,而不是在PHP中,因为PHP要求look-around断言的长度是固定的 我想要的是让相同的场景在PHP中工作,或者至少知道它是否可行 我试图减少正则表达式规则的解释,因此它与我上面提到的线程中的不同,但它遵循相同的原则 需要匹配由三部分组成的字符串: 以任意数量的字母数字字符开头 不包含“abc-”后跟3到5个数字和/或连字符 以“.htm”或“.html”结尾 因此,这些将匹配: xxxyz-123

我试图更多地了解look-around断言,我发现,它们的解决方案应该在某些引擎中工作,而不是在PHP中,因为PHP要求look-around断言的长度是固定的

我想要的是让相同的场景在PHP中工作,或者至少知道它是否可行

我试图减少正则表达式规则的解释,因此它与我上面提到的线程中的不同,但它遵循相同的原则

需要匹配由三部分组成的字符串:

  • 以任意数量的字母数字字符开头
  • 不包含“abc-”后跟3到5个数字和/或连字符
  • 以“.htm”或“.html”结尾
因此,这些将匹配:

  • xxxyz-123.html
  • xx123-abc.htm
  • xxabc123.html
  • xxabc-123-45.htm
但这些都不匹配:

  • xxabc-4324.htm
  • xxabc-1-2.html
  • xxac-12-34.txt
  • xxabc-12345.htm
我一直在尝试下面的正则表达式模式的一些变体,但它不起作用-这种特殊情况是因为固定长度限制:

*(

我还使用了不同的测试字符串,忘记了3-5范围部分,只关注准确的3个数字和/或连字符,并使用了下面的正则表达式,但仍然不起作用,这就是为什么我决定在这方面寻求帮助:

*(

你们当中有谁能帮我一下吗

编辑

这是我的测试PHP代码:

$regex = "/^(?!.*abc-[\d-]{3,5})[a-zA-Z0-9-]+\.html?$/";

foreach ( $matching2 as $k => $v ) {
    $matches = preg_match( $regex, $v );

    echo '"', $v, '"', ( $matches != 0 ) ? ' matches' : ' doesn\'t match', '<br />';
}
$regex=“/^(?。*abc-[\d-]{3,5})[a-zA-Z0-9-]+\.html?$/”;
foreach($k=>v的匹配2){
$matches=preg_match($regex,$v);
回显“',$v'”,($matches!=0)?“matches':“不匹配”,“
”; }
为什么需要反向看待这个问题?为什么不直接使用前瞻

^(?!.*abc-[\d-]{3,5}[^\d-])[a-zA-Z0-9-]+\.html?$
这将简单地从字符串的开头开始查找,并且先行查找尝试在字符串中的任何位置(
*
)查找不允许的字符串。如果这样做,则先行查找会使模式失败。这还包括字符串仅由字母数字和连字符组成的要求

顺便说一句,这与您链接的问题所使用的解决方案相同。Perl也无法处理可变长度的lookbehind。只有.NET可以


另一个注意事项:如果你遇到一个例子,你实际上需要一个可变长度的lookback(而不是可变长度的lookahead)…反转字符串(当然还有模式);

你可能在寻找regex模式

^(?!.*abc-[\d-]{3,5}[^\d-])[A-Za-z0-9].*[.]html?$

该示例不需要任何环顾断言。如果您对这三个部分有依赖关系,则会这样做。
xyz-123_45%20_67.htm
-匹配与否?匹配,因为它在.htm之前没有abc nnn[nn]部分extension@chris我不确定我是否理解你的陈述……请你进一步解释一下好吗?^..*?[^a][[^b][^c][^-][^0-9-]{3,5}\.htm(l){0.1}这是通用的正则表达式,不知道它是否完全是php风格。谢谢,但它与第四个字符串不匹配,它应该…我添加了一个编辑来显示我的测试代码,如果needed@andrux对。但是您的要求是“不包含”abc-“后跟3到5个数字和/或连字符”.第四个例子中的情况是这样的。你能澄清一下吗?为什么集合1中的例子4是匹配的,而集合2中的例子2是失败的@Ωmega我不太确定“以字母数字字符开头”要求。由于复数形式,我认为这可能意味着在文件扩展名之前应该只有字母数字字符。希望您对这个问题的评论能够澄清这一点。@andrux前瞻只是…一个前瞻…它实际上并不提升引擎在搜索字符串中的位置。也就是说,它不使用任何字符一旦我们完成了lookahead,并且看到模式不会因为lookahead中的要求而失败,引擎就会跳回lookahead开始的位置(字符串的开头)。现在我们需要匹配实际的文件名(不带扩展名)。这是您可以更改总共应允许哪些字符的地方。因此,OΩmega的问题由于您允许的不仅仅是字母、数字和连字符(根据您对问题的评论),这一部分可以放宽,就像OΩmega在其回答中所做的那样(只需要一个字母数字作为第一个字符,然后再允许使用任意字符)不确定,但
[^\d-]
不是双重否定吗?因为它在
中(?!
part@andrux我在第5条评论中解释了这一点(包括所有评论)在我的回答中。是的,在某种意义上,它是双重否定的,因为这是我们需要的。你是对的,我没有看到那部分……所以,我明白你的意思,但从我的角度看,它没有意义——尽管它按照你写的方式工作,也没有按照我的逻辑修改它的方式工作……当然,我的逻辑是w荣,所以我得继续调查。。。。