能否在不匹配的情况下仍返回true,对于不应该匹配的内容进行preg_match()操作是否可行?
例如,目前我们有...
if (preg_match('#^Mozilla(.*)#', $agent)) {
我们希望检查$agent中是否没有Mozilla字符串,但仍然让preg_match
返回true。
我们不能将其更改为:
if (!preg_match('#^Mozilla(.*)#', $agent)) {
能否在不匹配的情况下仍返回true,对于不应该匹配的内容进行preg_match()操作是否可行?
例如,目前我们有...
if (preg_match('#^Mozilla(.*)#', $agent)) {
我们希望检查$agent中是否没有Mozilla字符串,但仍然让preg_match
返回true。
我们不能将其更改为:
if (!preg_match('#^Mozilla(.*)#', $agent)) {
你需要的是一个负向先行断言,其语法为:
if (preg_match('#^(?!Mozilla).#', $agent)) {
实际上,你可以只使用 #^(?!Mozilla)#
来完成这个任务。我不确定 PHP 对于一个什么都没有的零宽度模式会有什么感觉,但是我已经在 JavaScript 中测试过了,它可以正常工作。
如果你想确保字符串中任何地方都没有出现 Mozilla
,可以使用以下代码...
if (preg_match('#^((?!Mozilla).)*$#', $agent)) {
...但仅在无法使用此选项时才这样做!
if (strpos($agent, 'Mozilla') !== false) {
if (preg_match('#^Mozilla(.*)#', $agent) === 0) {
preg_match
要么返回 0(未找到),要么返回 1(找到一个匹配项,不会继续搜索),要么返回 false(发生了一些问题)。 我使用 ===
来避免在从 preg_match
返回 false 时返回 true。preg_match('#^Mozilla(.*)#', $agent) === 0
和 !preg_match('#^Mozilla(.*)#', $agent)
是相同的,提问者表示他们无法使用后者。 - Walf$agent
将始终是一个字符串。因此,preg_match()
将永远不会返回false
,而!preg_match()
和preg_match() === 0
产生完全相同的布尔值。无论哪种方式,你都没有读到正则表达式是动态的,所以实际代码将像这样:if (preg_match($test, $agent)) {
,并且你不能(轻松地)选择是否动态否定preg_match()
。 - Walf!== false
和!== 0
之间存在差异。应该使用!== 0
或!== 1
来检查字符串是否匹配(或不匹配)某个正则表达式(而不是使用!== false
或!== true
)。 - Peter Mortensen#^(?!Mozilla)(.*)#
preg_match
返回值即可。 - Gumboif (!preg_match
。 - fire