Регулярные выражения PHP помогают в работе с Browser Agent String - PullRequest
2 голосов
/ 30 июня 2010

В настоящее время я пытаюсь выучить регулярные выражения на простых примерах из "реального мира".

Примите во внимание следующую строку:

Mozilla / 5.0 (Windows; U; Windows NT 5.0; en-US; rv: 1.9.2a1pre) Gecko

Я хочу найти значение RV (1.9.2a1pre).Мне нужно применить следующие правила:

  1. RV: может быть в любом случае (RV, rv, rV, Rv ...).
  2. RV: может быть где угодно вstring.
  3. Значение RV: оканчивается закрывающей скобкой, любым пробелом (включая разрыв строки), точкой с запятой или концом строки.

Пока я сделал:

/rv:[.][\)]?/i

но это не работает (я должен быть далек от "истинного" решения) ...

Выражение должно работать с PHP preg_match .

Ответы [ 7 ]

2 голосов
/ 30 июня 2010
/rv\s*:\s*([^;)\s]+)/i

будет соответствовать rv, затем следует : (который может быть окружен пробелами), затем набор символов, отличных от ;, ) и пробелов (включая символы новой строки). Результат матча (после rv:) будет зафиксирован в обратной ссылке №. 1.

1 голос
/ 30 июня 2010

Вот моя ревизия, чтобы позволить подстроке RV быть где угодно

/rv:[\s]*([^); ]+)/i
  • () обозначает группу захвата (т. Е. То, что вы хотите получить от этого процесса)
  • [^); ] означает символы, которые не ), *space* или ;
  • + означает один или несколько раз
  • * означает столько, сколько вам нужно, 0-многие.
  • [\s]* непосредственно перед скобками, в основном означает, что мы отбираем любые начальные пробелы из соответствия, что важно в этом случае, потому что мы явно говорим, что мыразбить основное совпадение на пробел.

Таким образом, мы собираемся захватить строку символов, исключая ) один или несколько символов длиной, сразу после rv:.

Ваша версия /rv:[.][\)]?/i ищет один ., а затем ).

0 голосов
/ 01 июля 2010
$str = 'Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.2a1pre) Gecko';
preg_match('/rv:([a-z0-9\.])*/im', $str , $matches);
echo $matches[1];
0 голосов
/ 01 июля 2010

Я думаю, что вы хотите, это:

(?<=rv:).*(?=\))

все в скобках является группой.это ?<= называется положительным взглядом позади.это в основном соответствует строке перед строкой, которую вы хотите.этот ?= называется положительным взглядом и соответствует строке после строки, которую вы хотите.поскольку требуемая строка - это просто числа, буквы и десятичное число или два, оператор . работает как универсальный вызов и соответствует любому символу, кроме разрывов строк.* обозначает один или несколько из предыдущих символов.

надеюсь, что это поможет

0 голосов
/ 30 июня 2010

может быть:

/rv:([^); \n]+)/i

, что означает НЕТ); перевод строки через один или несколько регистров без учета регистра и захвата

0 голосов
/ 30 июня 2010

попробуйте это ...

$str = 'Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.2a1pre) Gecko';
preg_match('/rv:([^\)]*)/i', $str , $matches);
echo $matches[1];
0 голосов
/ 30 июня 2010

Я думаю, [.] означает точку , а не «любой символ» используйте это вместо:

/rv:.+[\)]?/i
...