expo82 Ответов: 1

Как reqex match*|. * но игнорировать /*. * * / (комментарии)


Эй Ребята :-)

Есть ли regex pro, который может дать мне какие-либо подсказки?

Цель такова:

не допускайте подобных вещей:

select 
*, 
table_name.* 
from 
table_name


но разрешать такие вещи:

select 
/* my special comment with a * inside */ 
table_name.id 
from 
/* my cool table */ 
table_name


Мое знание регулярных выражений поддерживало меня в живых до тех пор, пока эта проблема не возникла :-)

Возможно ли это вообще?
Целевой движок, на котором должно выполняться регулярное выражение, - PHP 5.4+ < 7

Что я уже пробовал:

\bselect\б.*?(\*|\.\*).*?(?=\с\Б) и таких (или других) вещей.

Но это заглядывание вперед и lookbehinds, смущающие мой разум ;-)

Mohibur Rashid

Как насчет того, чтобы сделать это в два этапа,
1. Удалите все комментарии
2. выполняйте свою работу

1 Ответов

Рейтинг:
8

expo82

Я думаю, что нет другого способа сделать это так:

class SQLValidation
{

    const PATTERN_SQL_VALID_COMMENT = '~((\/\*).*?(\*\/))~ismu';
    const PATTERN_SQL_NOT_VALID     = '~\bselect\b.*?(\*|\.\*).*?(?=\bfrom\b)~ismu';

    /**
     * validates a sql string against * or .* in sql selectors
     * but allowes valid comments
     * 
     * @param string $queryString
     * @return bool true if there is any star selector in the queryString
     */
    public static function hasStarSelector($queryString)
    {
        $sql_without_comments = preg_replace(
           self::PATTERN_SQL_VALID_COMMENT, 
           '', 
           $queryString
        );
        return (
           preg_match(
             self::PATTERN_SQL_NOT_VALID, $sql_without_comments)
           ) ? 
        true : 
        false;
    }

 
}