嗨我在1中有3个正则表达式preg_match ...
我想知道是否可以将1个正则表达式混合在一起?
这是我的3个正则表达式:
if(!preg_match("#\s#",$file) && !preg_match("#\.\.\/#",$file) && (preg_match_all("#/#",$file,$match)==1)):
(我想:没有“空格”,没有“../”,只有1“/”)
感谢您的帮助。
修改
在列表中添加所需内容(更易读):
答案 0 :(得分:3)
答案 1 :(得分:3)
这很简单。让我们一步一步地制作这个正则表达式:
^$
I want: no "space"
,我们有\S
与非空白字符匹配:^\S+$
no "../"
,让我们添加一个负向前瞻^(?!.*[.][.]/)\S+$
,请注意我们不需要转义字符类中的点。至于转发,我们将使用不同的分隔符one optional "/"
,我们可以添加一个负面的预测,以防止2个前进^(?!(?:.*/){2})(?!.*[.][.]/)\S+$
s
修饰符以匹配换行符.
:~^(?!(?:.*/){2})(?!.*[.][.]/)\S+$~s
,然后使用 online demo < / LI>
醇>
答案 2 :(得分:2)
为什么不这样:
if (preg_match('~((?>[^\s/.]++|\.(?!\./))*)/?(?1)\z~A', $str))
echo 'OK';
细节:
~
( # capture group 1
(?>
[^\s./]++ # all that is not a space, a dot or a slash
| # OR
\.(?!\./) # a dot not followed by another dot and a slash
)*
)
/? # optional /
(?1) # repeat the capture group 1
\z # anchor for end of the string
~A # anchored pattern
注意:如果要排除空字符串,有两种可能:
if (preg_match('~(?=.)((?>[^\s/.]++|\.(?!\./))*)/?(?1)\z~A', $str))
或
if (preg_match('~((?>[^\s/.]++|\.(?!\./))*)/?(?1)\z~A', $str, $m) && $m)
答案 3 :(得分:1)
你不能合并三者,因为你有一个match_all。
我会用substr_count替换preg_match_all,因为pattern是静态的,所以它应该更快。
if(!preg_match("#\s|\.\./#",$file) && (substr_count($file,'/')<=1))
编辑:替换== 1由&lt; = 1表示/是可选的
Edit2:我们不会因为合并两个负面模式而失去太多的可读性