带有特殊字符的PHP strpos

时间:2018-01-25 14:17:12

标签: php special-characters strpos

我尝试用strpos()检查一个字符串。

$a = $_SERVER['REQUEST_URI'];

这很好用

if (strpos($a, 'en' ) == true)

但这不是

if (strpos($a, '/en/' ) == true) - Doesn't work

我尝试了很多东西来逃避角色或格式化字符串,但因为看起来我太傻了......

2 个答案:

答案 0 :(得分:3)

问题是strpos返回位置,否则返回FALSE。

因此,如果网址为/en/something/some,那么您将遇到位置为1并且任何非零数字为真的情况

当你执行/en/时,起始位置为0,这是假的。

您需要最后检查===或更准确!==示例

<?php

$a= "/en/blo";

if (strpos($a, '/en/' ) !== false){
    echo "TRUE";
} else {
    echo "FALSE";
}

答案 1 :(得分:-3)

因为strpos的结果可能是0在网址中/en/foo/bar,如果返回为零,==运算符会将条件设为false。

您必须使用!==代替==,并将其与false进行比较

if (strpos($a, '/en/' ) !== false)

然后,您必须确保'/ en /'位于正确的位置。我想你会在url的第一部分检查url是否有'/ en /',而不是在第二部分。所以我为你做了一些替代方案。

$tests  = ['/id/en/foobar/','/en/foo/bar', '/noen/in/here'];

foreach ($tests as $a)
{
    echo "$a\tcontain '/en/' on first part = ";

    if ( strpos($a, '/en/' ) === 0)
    {
        echo 'true';
    }else {
        echo 'false';
    }
    echo "\n";
}

另一种安全替代方案(使用爆炸):

$tests  = ['/id/en/foobar/','/en/foo/bar', '/noen/in/here'];

foreach ($tests as $a)
{
    echo "$a\tcontain '/en/' on first part = ";
    $part   = explode('/', trim($a,'/'));
    if ( @$part[0] == 'en' )
    {
        echo 'true';
    }else {
        echo 'false';
    }
    echo "\n";
}

示例输出:

/id/en/foobar/  contain '/en/' on first part = false
/en/foo/bar contain '/en/' on first part = true
/noen/in/here   contain '/en/' on first part = false

Reference - PHP Operators Comparison