Есть ли встроенная функция PHP, чтобы проверить, является ли данная строка зарезервированным ключевым словом? - PullRequest
4 голосов
/ 10 марта 2020

Я смотрю на это: https://www.php.net/manual/en/reserved.php Я сделал множество поисковых запросов для таких вещей, как: "php определить, является ли строка зарезервированным ключевым словом".

Я нахожу ничего, и я начинаю серьезно потеть. Пожалуйста, не говорите мне, что мне нужно будет написать сложный скрипт, чтобы регулярно просматривать руководство PHP для всех этих зарезервированных ключевых слов и создавать собственную базу данных!

Пожалуйста, пусть будет хорошая, простая функция для простой проверки:

var_dump(is_reserved_php_keyword('if'));

И она дает истину / ложь.

Ответы [ 2 ]

3 голосов
/ 10 марта 2020

Я пошел к Эндрю другим путем и вместо этого попытался выяснить это PHP, а не жестко кодировать список.

function isPhpKeyword($testString) {
    // First check it's actually a word and not an expression/number
    if (!preg_match('/^[a-z]+$/i', $testString)) {
        return false;
    }
    $tokenised = token_get_all('<?php ' . $testString . '; ?>');
    // tokenised[0] = opening PHP tag, tokenised[1] = our test string
    return reset($tokenised[1]) !== T_STRING;
}

https://3v4l.org/WA6dr

Это имеет несколько преимуществ:

  1. Не нужно вести список, так как собственный синтаксический анализатор PHP говорит, что действительно или нет.

  2. Это гораздо проще понять.

1 голос
/ 10 марта 2020

К сожалению, я не знаю ни одной встроенной функции для того, что вы описываете. Но на основе шаблона RegEx, который вы можете найти среди добавленных заметок на PHP. net, вы можете протестировать его следующим образом:

$reserved_pattern = "/\b((a(bstract|nd|rray|s))|(c(a(llable|se|tch)|l(ass|one)|on(st|tinue)))|(d(e(clare|fault)|ie|o))|(e(cho|lse(if)?|mpty|nd(declare|for(each)|if|switch|while)|val|x(it|tends)))|(f(inal|or(each)?|unction))|(g(lobal|oto))|(i(f|mplements|n(clude(_once)?|st(anceof|eadof)|terface)|sset))|(n(amespace|ew))|(p(r(i(nt|vate)|otected)|ublic))|(re(quire(_once)?|turn))|(s(tatic|witch))|(t(hrow|r(ait|y)))|(u(nset|se))|(__halt_compiler|break|list|(x)?or|var|while))\b/";

if(!preg_match($reserved_pattern, $myString)) {
    // It is not reserved!
};

Возможно, это не самый элегантный на вид фрагмент PHP код, но он выполняет свою работу.

ОБНОВЛЕНИЕ: См. Демонстрацию функции здесь: https://3v4l.org/CdIjt

...