奇怪的不可接受的PHP正则表达式模式

奇怪的不可接受的PHP正则表达式模式,php,regex,Php,Regex,因此,在试图修复一个意外错误的过程中,我得出了以下结论:在php中,以下内容在某种程度上是不可接受的: $pattern = "/\/sc2\/en\/profile\/693604\/1\/EGIdrA\/ladder\/"; $subject = "\/sc2\/en\/profile\/693604\/1\/EGIdrA\/ladder\/"; preg_match($pattern, $subject, $result); 我不知道如何或为什么——我所知道的是,如果我有这一行,那么在这

因此,在试图修复一个意外错误的过程中,我得出了以下结论:在php中,以下内容在某种程度上是不可接受的:

$pattern = "/\/sc2\/en\/profile\/693604\/1\/EGIdrA\/ladder\/";
$subject = "\/sc2\/en\/profile\/693604\/1\/EGIdrA\/ladder\/";
preg_match($pattern, $subject, $result);
我不知道如何或为什么——我所知道的是,如果我有这一行,那么在这一行前后不同位置的各种单词的各种调试回音将不再回音。任何地方都没有循环,所以我很困惑为什么会出现问题。

以下是原因:

preg_match('/^\/$/', '\/'); // false
preg_match('/^\/$/', '/'); // true
原因如下:

preg_match('/^\/$/', '\/'); // false
preg_match('/^\/$/', '/'); // true

没有必要在字符串中转义斜杠<代码>'\/'与
'\\/'
相同,即字符串
\/

在正则表达式中,如果使用斜杠终止表达式,
\/
将转义斜杠。您不需要这样做,只需选择另一个终止符,如
#

preg\u match
的单个调用不会停止程序的执行。但是,可能会发出各种错误和警告—例如,在正则表达式中缺少一个终止的
/
,这将产生

PHP Warning:  preg_match(): No ending delimiter '/' found

检查服务器的php设置(即和),查看警告和错误输出配置。在许多系统上,
/var/log/apache*/error.log
包含所有php错误和警告。请注意,集合可以修改输出,使其成为无效的XML文档或混淆高级输出缓冲。

不需要在字符串中转义斜杠<代码>'\/'与
'\\/'
相同,即字符串
\/

在正则表达式中,如果使用斜杠终止表达式,
\/
将转义斜杠。您不需要这样做,只需选择另一个终止符,如
#

preg\u match
的单个调用不会停止程序的执行。但是,可能会发出各种错误和警告—例如,在正则表达式中缺少一个终止的
/
,这将产生

PHP Warning:  preg_match(): No ending delimiter '/' found

检查服务器的php设置(即和),查看警告和错误输出配置。在许多系统上,
/var/log/apache*/error.log
包含所有php错误和警告。请注意,集合可能会修改输出,使其成为无效的XML文档或混淆高级输出缓冲。

您不应该在输入字符串中转义斜杠,在模式中转义斜杠就足够了

preg_match('/^\/sc2\/en\/profile\/693604\/1\/EGIdrA\/ladder\/$/',
       '/sc2/en/profile/693604/1/EGIdrA/ladder/', $result);

(或者像前面提到的phihag一样,使用i.e.#来终止模式)

您不应该在输入字符串中转义斜杠,在模式中转义斜杠就足够了

preg_match('/^\/sc2\/en\/profile\/693604\/1\/EGIdrA\/ladder\/$/',
       '/sc2/en/profile/693604/1/EGIdrA/ladder/', $result);


(或者像前面提到的phihag一样,使用i.e.#来终止模式)

那么在这一行之后,页面什么也不做?您是否已排除此项并在新脚本中对其进行了测试?是的,在这一行之后(预计返回false),页面将不执行任何操作。此外,如果这一行在这里,那么这一行之前的一些东西也不再起作用。注释掉这一行可以修复一切。我的意思是,例如,回声“测试线1”//有问题的线路回显“测试线路2”;如果所讨论的行没有被注释掉,那么“测试行1”和“测试行2”都不会得到回音。然而,如果我注释掉这行,那么两个测试行都会被回响。如果我修复了preg_match()以便存在匹配项,则不会发生此类错误。您在编辑问题的过程中也引入了语法错误
$subject='…'l
。但我无法更改它,因为编辑内容必须至少有6个字符不同。为了清楚起见,每个回音和相关行都在各自的行上。显然我不能在评论中换行:/是的,第2行末尾的1应该是a;但是语法错误当然不在代码中,所以在这一行之后,页面什么也不做?您是否已排除此项并在新脚本中对其进行了测试?是的,在这一行之后(预计返回false),页面将不执行任何操作。此外,如果这一行在这里,那么这一行之前的一些东西也不再起作用。注释掉这一行可以修复一切。我的意思是,例如,回声“测试线1”//有问题的线路回显“测试线路2”;如果所讨论的行没有被注释掉,那么“测试行1”和“测试行2”都不会得到回音。然而,如果我注释掉这行,那么两个测试行都会被回响。如果我修复了preg_match()以便存在匹配项,则不会发生此类错误。您在编辑问题的过程中也引入了语法错误
$subject='…'l
。但我无法更改它,因为编辑内容必须至少有6个字符不同。为了清楚起见,每个回音和相关行都在各自的行上。显然我不能在评论中换行:/是的,第2行末尾的1应该是a;但是这个语法错误当然不在代码中。嗯,我原以为它会返回false,但让我吃惊的是它完全破坏了脚本的执行,在测试中不再出现回声。哎呀,我不是要按enter键。但是,改变它确实解决了所有问题。假返回真的会对脚本执行造成那么大的影响吗?o、 oHmm,我希望它返回false,但让我吃惊的是它完全破坏了脚本的执行,在测试中不再出现回声。哎呀,我不是故意要按enter键的。但是,改变它确实解决了所有问题。假返回真的会对脚本执行造成那么大的影响吗?o、 oIs在输入中有转义斜杠是什么导致该行不执行的?我确实希望它不匹配,但我没想到它会停止脚本执行。@zheng不,不完全是这样。我更新了我的答案。请注意,由于输出(和其他)缓冲,echo不是一个可靠的调试实用程序。我更新了我的答案,加入了一个关于警告和错误日志的简短入门。我想说,输入中的“转义”斜杠并不是真正的转义斜杠,因为它们不应该转义(在输入字符串中,您只会转义像\'这样的引号)。所以解析器不知道是什么