php условное регулярное выражение - PullRequest
2 голосов
/ 25 сентября 2011

Мне тяжело разобраться с этим. Я работаю с системой пользовательских плагинов, которая представляет такие вещи:

<plugin:class:method var1='hello', var2='yes' />

Но, ': method' и переменные не должны существовать - требуется только 'class'. Для instace все должно быть в порядке:

<plugin:class />

Проблема, с которой я сталкиваюсь, заключается в том, как заставить регулярное выражение возвращать вещи, когда метод и / или переменные не существуют. До сих пор я могу получить результаты, когда все части существуют, но не иначе - это то, где я нахожусь (борясь с первым условным условием):

$f = "/<plugin:(?P<class>\w+)(?(?=^:)?P<method>\w+)\s+(.*)\/>/sUi";

С приведенным ниже кодом все работает очень хорошо, просто нужно вернуть все кусочки с условиями:

preg_replace_callback($f, array($this, 'processing'), $text);

Надеюсь, это имеет какой-то смысл - и даже возможно. Спасибо.

Ответы [ 2 ]

1 голос
/ 25 сентября 2011

Самый простой и обслуживаемый способ сделать это - просто получить всю строку plugin:class:method с простым выражением /plugin:\S+/, а затем explode(':', $string).

Итак, вместо приведенного выше кода,у вас будет что-то вроде:

$f = "/<plugin:(\S+)\s+(.*?)\/>/sUi";
if (preg_match($f, $string, $matches)) {
    $parts = explode($matches[1]);
    if (!in_array('method', $parts))
    {
        // do whatever needs done if "method" is not present
    }
    // ...
}
0 голосов
/ 25 сентября 2011

Не должно ли (?=^:) быть (?!:)?

...