Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
预赛或\在PHP中_Php_Regex - Fatal编程技术网

预赛或\在PHP中

预赛或\在PHP中,php,regex,Php,Regex,我正在努力匹配或者/在PHP中使用preg_match 我以为这样就可以了,但它匹配所有字符串 $string = ''; $chars = '/(\.|\\|\/)/'; if (preg_match($chars, $string) != 0) { echo 'Chars found.'; } 问题可能在于PHP。在转义正则表达式字符串中的内容时,还需要转义用于转义的反斜杠,否则PHP将尝试将其解释为特殊字符 因为这可能没有道理,请举个例子 $string=“\”将使PHP尝试逃逸

我正在努力匹配或者/在PHP中使用preg_match

我以为这样就可以了,但它匹配所有字符串

$string = '';
$chars = '/(\.|\\|\/)/';
if (preg_match($chars, $string) != 0) {
    echo 'Chars found.';
}

问题可能在于PHP。在转义正则表达式字符串中的内容时,还需要转义用于转义的反斜杠,否则PHP将尝试将其解释为特殊字符

因为这可能没有道理,请举个例子


$string=“\”
将使PHP尝试逃逸,并失败。相反,您需要将其更改为
$string=“\\\”

问题可能与PHP有关。在转义正则表达式字符串中的内容时,还需要转义用于转义的反斜杠,否则PHP将尝试将其解释为特殊字符

因为这可能没有道理,请举个例子


$string=“\”
将使PHP尝试逃逸,并失败。如果逻辑有缺陷,则需要将此更改为
$string=“\\\.”
您的
。将返回匹配数。因此,
==0
表示“没有匹配项”

也就是说,除了
\'
\
之外,不要展开转义序列。您需要将反斜杠转义加倍,以便它按预期显示在正则表达式中。将代码更改为:

$string = '';
$chars = '/(\.|\\\\|\/)/';
if (preg_match($chars, $string) != 0) {
    echo 'Chars found.';
}
下面是一个测试用例:

$strings = array('', '.', '/', '\\', 'abc');
$pattern= '/(\.|\\\\|\/)/'

foreach($strings as $string) {
    if (preg_match($pattern, $string) > 0) {
        printf('String "%s" matched!', $string);
    }
}

您的
if
逻辑有缺陷。将返回匹配数。因此,
==0
表示“没有匹配项”

也就是说,除了
\'
\
之外,不要展开转义序列。您需要将反斜杠转义加倍,以便它按预期显示在正则表达式中。将代码更改为:

$string = '';
$chars = '/(\.|\\\\|\/)/';
if (preg_match($chars, $string) != 0) {
    echo 'Chars found.';
}
下面是一个测试用例:

$strings = array('', '.', '/', '\\', 'abc');
$pattern= '/(\.|\\\\|\/)/'

foreach($strings as $string) {
    if (preg_match($pattern, $string) > 0) {
        printf('String "%s" matched!', $string);
    }
}

在尝试正则表达式匹配斜杠时,我强烈建议使用不同于“/”的分隔符。它减少了您需要执行的转义操作,并使其更具可读性:

$chars = '%(\.|\\|/)%';

在尝试正则表达式匹配斜杠时,我强烈建议使用不同于“/”的分隔符。它减少了您需要执行的转义操作,并使其更具可读性:

$chars = '%(\.|\\|/)%';
试试这个:

$chars = '%(\.|\\\\|/)%'
试试这个:

$chars = '%(\.|\\\\|/)%'

提供给
preg_match()
的参数是字符串。字符串由PHP自动转义。例如,如果给regexp引擎指定了
{\\\\}
(反斜杠),PHP将首先解析它,创建
{\\\}
\\
替换为
\

接下来,regexp引擎解析regexp。它可以看到PHP提供给regexp引擎的
{\\}
。它将
\
视为转义字符,因此它实际上匹配由
\
转义的
\
字符

在您的例子中,它看起来像
/(\.\\\\\\\\/)/
。PHP提供给regexp引擎
/(\.\\\\\/)/
,它实际上是
(注意
字符被转义)

就我个人而言,我尽量避免转义元字符,尤其是在regexp引擎的工作方式方面。我通常使用
[.]
来代替,它更具可读性。用它编写的regexp看起来像
/([.]\\\\\\\\\\\\\\\\\\\\\\[/])/

可以进行一些优化。虽然这是我个人的事情,但我更喜欢使用
{}
作为分隔符(是的,可以使用成对字符)。此外,您的regexp匹配单个字符,因此您可以轻松地将其编写为
{[.\\\/]}
,在我看来这是非常可读的(注意四个斜杠,因为PHP和regexp引擎都需要解析反斜杠)

另外,
preg_match()
返回匹配数。它总是比<代码> 0 更大,因此您可以很容易地认为它是布尔型的,并且避免写入<代码>=0 < /COD>。相反,您可以插入
使其为负值。但我认为您意外地改变了条件(如果不匹配,则匹配)。有效代码如下:

$string = '';
$chars = '{[.\\\\/]}';
if (preg_match($chars, $string)) {
    echo 'Chars found.';
}

提供给
preg_match()
的参数是字符串。字符串由PHP自动转义。例如,如果给regexp引擎指定了
{\\\\}
(反斜杠),PHP将首先解析它,创建
{\\\}
\\
替换为
\

接下来,regexp引擎解析regexp。它可以看到PHP提供给regexp引擎的
{\\}
。它将
\
视为转义字符,因此它实际上匹配由
\
转义的
\
字符

在您的例子中,它看起来像
/(\.\\\\\\\\/)/
。PHP提供给regexp引擎
/(\.\\\\\/)/
,它实际上是
(注意
字符被转义)

就我个人而言,我尽量避免转义元字符,尤其是在regexp引擎的工作方式方面。我通常使用
[.]
来代替,它更具可读性。用它编写的regexp看起来像
/([.]\\\\\\\\\\\\\\\\\\\\\\[/])/

可以进行一些优化。虽然这是我个人的事情,但我更喜欢使用
{}
作为分隔符(是的,可以使用成对字符)。此外,您的regexp匹配单个字符,因此您可以轻松地将其编写为
{[.\\\/]}
,在我看来这是非常可读的(注意四个斜杠,因为PHP和regexp引擎都需要解析反斜杠)

另外,
preg_match()
返回匹配数。它总是比<代码> 0 更大,因此您可以很容易地认为它是布尔型的,并且避免写入<代码>=0 < /COD>。相反,您可以插入
使其为负值。但我认为您意外地改变了条件(如果不匹配,则匹配)。有效代码如下:

$string = '';
$chars = '{[.\\\\/]}';
if (preg_match($chars, $string)) {
    echo 'Chars found.';
}

你试过了吗?是否有错误?所有内容都匹配,而不仅仅是带有。\or/的字符串。我没有错,你试过了吗?是否有错误?所有内容都匹配,而不仅仅是带有。\or/的字符串。我没有收到错误。不是在使用单引号的时候。不是在使用单引号的时候。啊,我已经更新了我的代码。在我的例子中,这只是一个输入错误。问题依然存在。啊,我有你