Php preg_match到底是如何工作的?

Php preg_match到底是如何工作的?,php,regex,validation,Php,Regex,Validation,我编写了一个简单的函数来检查我发送的字符串是否“应该”有效 // this works without problems function validate_email ($value) { return preg_match ("/^[^0-9][A-z0-9_]+([.][A-z0-9_]+)*[@][A-z0-9_]+([.][A-z0-9_]+)*[.][A-z]{2,4}$/", $value); } // this doesn't work function valida

我编写了一个简单的函数来检查我发送的字符串是否“应该”有效

// this works without problems
function validate_email ($value) {
    return preg_match ("/^[^0-9][A-z0-9_]+([.][A-z0-9_]+)*[@][A-z0-9_]+([.][A-z0-9_]+)*[.][A-z]{2,4}$/", $value);

}

// this doesn't work
function validate_string ($value) {
    return preg_match ("([^<>?=/\]+)", $value);

}

([^?=/]+)
中的
^
字符应表示不匹配字符串开头(
^
)和结尾(
$
)之后的字符。所以
“ton?asd=3”
匹配,因为模式匹配
t
(字符串的其余部分不相关)。

\
是元字符,需要对其进行转义。是的

return preg_match ("([^<>?=/\\\\]+)", $value);
返回preg\u match(([^?=/\\]+)”,$value);

您的代码中有几个错误。除此之外,
“ton\ino\”
不是有效的字符串,
[^?=/\]+
不是有效的正则表达式,您可能有一些逻辑上的误解

如果至少有一个字符不是
=
=
=
/
\
,则正则表达式将匹配。因此,如果至少有一个这样的字符,
preg\u match
返回
1
ton\ino“
ton?asd=3
都至少包含一个这样的字符(在这两种情况下都匹配
ton

解决方法是对字符串的开头和结尾使用断言(
^
$
)以仅允许整个字符串使用合法字符:

^[^<>?=/\\]+$
但最好使用白名单而不是黑名单。

函数validate\u string($value){
function validate_string ($value) {
    return !preg_match('#[<>?=/\\\\]#', $value);
}
return!preg\u match(“\\[?=/\\\]\\\\”,$value); }
该电子邮件检查无法正常工作。它无法匹配example@example.museum对于初学者来说。是的,它使用不超过4个字符的扩展名验证地址。museum是有效的扩展名吗?它与诸如“.mobi”或“.xn--0zwm56d”之类的名称一起验证地址:与“.mobi”一起验证“还是什么?;)我相信模式匹配您的示例中的
'ton'
,是的,它将匹配
ton
(因为表达式是贪婪的)。
t
是它实际匹配所需的全部(尽管我没有很好地表达)。谢谢,我每次都试图记住所有的正则表达式规则,但我总是失败!!这个regexp是无效的,甚至不会编译@lvaro Oops-忘记正确地转义而建议正确地转义:讽刺的是,你的名字是……呃。。。您的表达式也不是有效的正则表达式。@阿尔瓦罗·G.维卡里奥:修复了它。我总是在使用regexp时遇到麻烦,谢谢您的帮助,我使用这个表达式是因为它用于类似last.fm日本艺术家的URL,所以我应该插入几乎所有的字符。这可能是有用的代码,也可能不是有用的代码,但它并没有回答这个问题。仅仅显示一小段代码并不能帮助询问者或其他读者理解问题及其解决方案。
function validate_string ($value) {
    return !preg_match("([<>?=/\\\\]+)", $value);
}
function validate_string ($value) {
    return !preg_match('#[<>?=/\\\\]#', $value);
}