preg_match for。 /或\在PHP中

时间:2011-11-13 15:28:16

标签: php regex

我想要匹配。 \或/在PHP中使用preg_match。

我认为这会做到,但它匹配所有字符串。

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

5 个答案:

答案 0 :(得分:3)

您的if逻辑存在缺陷。 preg_match将返回匹配数。因此,== 0表示“不匹配”。

也就是说,single quoted strings不会展开除\'\\之外的转义序列。您需要加倍反斜杠转义才能使其按预期显示在正则表达式中。将您的代码更改为:

$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);
    }
}

答案 1 :(得分:3)

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

接下来,regexp引擎解析正则表达式。它看到了PHP给regexp引擎的{\\}。它将\视为转义字符,因此它实际上匹配\转义的\字符。

在您的情况下,它看起来像/(\.|\\|\/)/。 PHP为regexp引擎/(\.|\|\/)/提供了.|/(注意|字符已被转义)。

就个人而言,我尽量避免转义元字符,特别是regexp引擎的工作原理。我通常使用[.]代替它,它更具可读性。用这个写的正则表达式看起来像/([.]|\\\\|[/])/

可以做一些优化。虽然这是我个人的事情,但我更喜欢使用{}作为分隔符(是的,你可以使用成对的字符)。此外,你的正则表达式匹配单个字符,所以你可以很容易地把它写成{[.\\\\/]},这在我看来是非常易读的(注意四个斜杠,因为PHP和regexp引擎都解析反斜杠所需要的。)

此外,preg_match()返回匹配数。它将始终大于0,因此您可以轻松地将其视为布尔值并避免写入== 0。相反,您可以在字符串之前插入!以使其为负数。但我认为你不小心扭转了条件(如果它不匹配则匹配)。有效代码如下:

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

答案 2 :(得分:1)

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

因为这可能没有意义,请举个例子。

$string = "\."将使PHP尝试逃避。,并失败。您需要将其更改为$string = "\\\."

答案 3 :(得分:0)

当尝试REGEX匹配斜杠时,我强烈建议使用与'/'不同的分隔符。它减少了您需要执行的转义量并使其更具可读性:

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

答案 4 :(得分:0)

试试这个:

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