Regex - избегайте любых ненужных поисков preg_match () PHP

0

Привет, у меня небольшая проблема с моим регулярным выражением.

Для простоты:

$pattern='/^(a([0-9]|[a-z])?|b(\=|\?)?)$/';
$subject='b=';

возвращает массив:

Array
(
[0] => b=
[1] => b=
[2] => 
[3] => =
)

Номер индекса 2 в этом массиве - от (...)? - мой вопрос: могу ли я избежать этого поля в моем результате? У меня очень длинный шаблон, и мой массив на 90% пуст. Могу ли я удалить эти пустые поля некоторыми волшебными символами?

Изменение: В моем шаблоне у меня есть что-то вроде этого:

n(o|h)?(\+|\-|\(([+]?[0-9]+);([+]?[0-9]+)\))?

Он будет искать строки, такие как no+ или n (12; 15). Могу ли я сделать это проще? И у меня больше текста, как это, это значит, что у меня есть что-то вроде этого:

/^(n(o|h)?(\+|\-|\(([+]?[0-9]+);([+]?[0-9]+)\))?|i(o|h)?(\+|\-|\(([+]?[0-9]+);([+]?[0-9]+)\))?)$/

С уважением

  • 1
    Ваш шаблон, вероятно, плохо разработан. Если вы объясните (с помощью примеров строк), что вы пытаетесь сопоставить, мы можем предложить вам лучший подход.
  • 0
    Упростите это ^(?:a[0-9a-z]?|b[=?]?)$ Как указано @CasimiretHippolyte
Показать ещё 2 комментария
Теги:
preg-match

1 ответ

1
Лучший ответ

После прочтения вашего шаблона я предполагаю, что вы можете упростить эту версию:

\A([in][oh]?)([+-]|\(\+?[0-9]+;\+?[0-9]+\))\z

демонстрация

Обратите внимание: я не знаю точно, какие именно вам нужны, но вы можете добавить их, как хотите.

Детали:

\A                          # anchor for the start of the string
(                           # capture group 1:
    [in]                    # a 'i' or a 'n'
    [oh]?                   # a 'o' or a 'h' (optional)
)

(                           # capture group 2:
    [+-]                    # a '+' or a '-'
  |                         # OR
    \(\+?[0-9]+;\+?[0-9]+\)
)
\z                          # anchor for the end of the string
  • 0
    Спасибо, чувак, я не могу дать тебе +1: <Извини, братан, и еще раз спасибо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню