我想要匹配。 \或/在PHP中使用preg_match。
我认为这会做到,但它匹配所有字符串。
$string = '';
$chars = '/(\.|\\|\/)/';
if (preg_match($chars, $string) != 0) {
echo 'Chars found.';
}
答案 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 = '%(\.|\\\\|/)%'