Как найти несколько совпадений с одним регулярным выражением? - PullRequest
0 голосов
/ 12 мая 2010

У меня есть следующая строка:

response: id="1" message="whatever" attribute="none" world="hello"

Порядок атрибутов является случайным. Там может быть любое количество других атрибутов.

Есть ли способ получить атрибут id, message и world в одном регулярном выражении вместо применения следующих трех одно за другим?

/ message="(.*?)"/
/ world="(.*?)"/
/ id="(.*?)"/

Ответы [ 4 ]

2 голосов
/ 12 мая 2010

Этого можно добиться, используя три положительных прогнозных утверждения с .* в начале:

<?php
$re = '/(?=.* message="(.*?)")(?=.* world="(.*?)")(?=.* id="(.*?)")/';

$string = '<response id="1" message="whatever" attribute="none" world="hello" />';

preg_match($re, $string, $matches);
var_dump($matches);

Вывод:

array(4) {
  [0]=>
  string(0) ""
  [1]=>
  string(8) "whatever"
  [2]=>
  string(5) "hello"
  [3]=>
  string(1) "1"
}

Конечно, этот шаблон не будет работатьесли какой-либо из этих 3 параметров отсутствует (что может быть полезно и вам ...).Если вы хотите, чтобы они были необязательными, вы можете дополнительно обернуть внутреннюю область просмотра в группу без захвата и сделать ее необязательной (?:....)? (в этом примере параметр "world" необязательный)

/(?=.* message="(.*?)")(?=(?:.* world="(.*?)")?)(?=.* id="(.*?)")/
0 голосов
/ 12 мая 2010

Ниже представлен лучший вариант, который я могу придумать. Он должен фиксировать фактические атрибуты, сопоставленные в каждой точке, их значения, а также разрешать любые другие промежуточные значения. Хотя это не совсем правильно, и вам бы лучше использовать «настоящий» парсер.

/((message|attribute|world)="([^"]*)").*?((message|attribute|world)="([^"]*)").*?((?:message|attribute|world)="([^"]*)")/
0 голосов
/ 12 мая 2010

Если вы используете preg_match, то существует необязательный третий аргумент, который будет хранить все регулярные выражения groups (в основном все, что в скобках), а также полное совпадение .

Так что используйте все это как одно регулярное выражение, и тогда 2-й, 3-й и 4-й элементы будут message, world и id соответственно (1-й будет вся строка, которая соответствует.

0 голосов
/ 12 мая 2010

Я не парень с регулярными выражениями, так что это может быть неправильно. Если это так, не отрицайте =), просто дайте мне знать, и я удалю это! : -D

Не могли бы вы или фразы вместе и сопоставить это?

/ (message|world|id)="(.*?)"/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...