2016-08-02 7 views
1

Я пытаюсь создать регулярное выражение для выражения, чтобы получить значения для Boost Mobile или BoostMobile в зависимости от того, что присутствует.PHP Regex отображает либо abc, либо abc xyz format

Любые предложения, пожалуйста?

+0

Порядок имеет значение 'подталкивания \ b' соответствует первым. '\ W * ((? I) Boost \ s * Mobile \ b (? - i) | (? I) Boost \ b (? - i) \ s *) \ W *' будет работать. Получите лучший ответ ниже. – chris85

ответ

3

В регулярных выражениях NFA, в группах необеспеченных групп чередования, совпадение первого ответвления останавливает групповую обработку, остальные ветви, расположенные дальше справа, не проверяются на строку. Вы можете прочитать больше об этом на странице Alternation with The Vertical Bar or Pipe Symbol.

Таким образом, меняя значения и упрощая картину можно использовать

/\b(Boost \s*Mobile|Boost)\b/i 

Однако, наиболее эффективным способом здесь за счет использования дополнительного группы:

/\bBoost(?:\s*Mobile)?\b/i 
     ^^   ^^ 

См regex demo

i Модификатор, нечувствительный к регистру, задан для всего регулярного выражения. Вам не нужно включать и выключать его в начале/конце рисунка. Кроме того, \W* может соответствовать пустой строке, поэтому ваш способ проверки границы слова может не работать здесь, когда будет работать \b. Подробнее

шаблона:

  • \b - ведущий граница слова
  • Boost - буквальная подстроку
  • (?:\s*Mobile)? - опциональная группу, соответствующей 1 или 0 последовательности
    • \s* - 0 + пробелы
    • Mobile - буквальный подстрока
  • \b - конечные границы слова
+0

Большое вам спасибо! Оба решения работали! – user6622569

Смежные вопросы