match whole word only without regex

前端 未结 4 1867
既然无缘
既然无缘 2021-01-26 07:27

Since i cant use preg_match (UTF8 support is somehow broken, it works locally but breaks at production) i want to find another way to match word against blacklist. Problem is, i

4条回答
  •  [愿得一人]
    2021-01-26 07:49

    If you want to mimic the \b modifier of regex you can try something like this:

    $offset = 0;
    $word = 'badword';
    $matched = array();
    while(($pos = strpos($string, $word, $offset)) !== false) {
        $leftBoundary = false;
        // If is the first char, it has a boundary on the right
        if ($pos === 0) {
           $leftBoundary = true;
        // Else, if it is on the middle of the string, we must check the previous char
        } elseif ($pos > 0 && in_array($string[$pos-1], array(' ', '-',...)) {
            $leftBoundary = true;
        }
    
        $rightBoundary = false;
        // If is the last char, it has a boundary on the right
        if ($pos === (strlen($string) - 1)) {
           $rightBoundary = true;
        // Else, if it is on the middle of the string, we must check the next char
        } elseif ($pos < (strlen($string) - 1) && in_array($string[$pos+1], array(' ', '-',...)) {
            $rightBoundary = true;
        }
    
        // If it has both boundaries, we add the index to the matched ones...
        if ($leftBoundary && $rightBoundary) {
            $matched[] = $pos;
        }
    
        $offset = $pos + strlen($word);
    }
    

提交回复
热议问题