正则表达式验证可以接收下一个字符串样本:
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 ..."的情况下对字符串进行有效验证部分我需要第二个验证字符串:^(.*[^\/])\/+$
我想只有一个验证规则。
任何想法如何结合它们?
答案 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
答案 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////... )