使用正则表达式的验证规则

时间:2014-04-24 19:44:04

标签: regex pcre

正则表达式验证可以接收下一个字符串样本:

t/E/s/t
t/E/s/t/
t/E/s/t/////...
t/E/s/t/////?page=10
t/E/s/t/////?page=10/
t/E/s/t/////?page=10////...

我需要将字符串拆分为部分:

1. t/E/s/t
2. ?page=10////... 
  • [点表示" /"符号可以重复多次]。如果"?..."部分不存在第二个结果字符串应为空。

我写过正则表达式:^(.*[^\/])\/+(\?.*)$ 如果文本字符串不包含"?page = 10 ///..."的一部分,则它不起作用的问题。要在没有"?page ..."的情况下对字符串进行有效验证部分我需要第二个验证字符串:^(.*[^\/])\/+$

我想只有一个验证规则。

任何想法如何结合它们?

3 个答案:

答案 0 :(得分:1)

如果/(.*[^\/])\/*(\?.*)?/之类的东西有用,那就太好了。但问题是正则表达式引擎会找到(.*[^\/])\/*的最佳匹配,即使这意味着将(\?.*)?与空字符串匹配。*

您可以执行以下操作:

/(.*[^\/])\/*(\?.*)|(.*[^\/])/

这有点令人不满意,因为你得到3个捕获组,即使你只想要2.所以你可以这样做,如果你使用的语言(版本)允许(?|...)构造:

/(?|(.*[^\/])\/*(\?.*)|(.*[^\/]))/

*更一般地说,假设正则表达式引擎面临正则表达式/AB/。它返回的匹配将包含/A/的最佳匹配(我指的是实际可以扩展为/AB/匹配的最佳匹配)。换句话说,在完成A的匹配搜索之前,它不会回溯到B

答案 1 :(得分:0)

作为快速说明,我使用~代替/作为分隔符,因此您的/不需要转义。此外,我使用了问号([?])的字符类,而不是必须转义它(\?)...这只是个人对可读性的偏好。

首先我们捕获文字字符串t/E/s/t。然后我们在//之间匹配0 + t/E/s/t s(如果需要?,则更改{{1}对于1+而言,*。最后,我们捕获问号,然后是行的其余部分(+)。对于尾随[?].*,这是可选的,因此如果您的字符串没有?,它仍然会与空的第二次捕获相匹配。

?page=10

Regex101

答案 2 :(得分:0)

这是你在找什么?

<?php
$strings = array(
"t/E/s/t", 
"t/E/s/t/",
"t/E/s/t/////...",
"t/E/s/t/////?page=10",
"t/E/s/t/////?page=10/",
"t/E/s/t/////?page=10////...");
$regex ='~(?<=t/E/s/t)/+~';
foreach($strings as $str) {
    print_r(preg_split($regex,$str));
    echo "<br />";
}

<强>输出:

Array ( [0] => t/E/s/t )
Array ( [0] => t/E/s/t [1] => )
Array ( [0] => t/E/s/t [1] => ... )
Array ( [0] => t/E/s/t [1] => ?page=10 )
Array ( [0] => t/E/s/t [1] => ?page=10/ )
Array ( [0] => t/E/s/t [1] => ?page=10////... )