В PHP как мне выполнить регулярное выражение, которое возвращает только то, что было сгруппировано - PullRequest
0 голосов
/ 15 мая 2010

Я хочу выполнить регулярное выражение с помощью группировки. Меня интересует только группировка, все что я хочу вернуть. Это возможно?

$haystack = '<a href="/foo.php">Go To Foo</a>';
$needle = '/href="(.*)">/';
preg_match($needle,$haystack,$matches);
print_r($matches);

//Outputs
//Array ( [0] => href="/foo.php">  [1] => /foo.php ) 

//I want:
//Array ( [0] => /foo.php ) 

Ответы [ 3 ]

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

На самом деле это возможно с осторожностью. Вместо:

href="(.*)">

Вы хотите

(?<=href=").*(?=">)

Теперь это будет соответствовать (и, следовательно, охватывать группу 0) любому .*, которому предшествует href=", а затем ">. Обратите внимание, что я очень подозреваю, что вам действительно нужно .*? вместо этого, то есть вместо того, чтобы жадничать.

---A--Z---A--Z----
   ^^^^^^^^^^^
      A.*Z

В любом случае, похоже, что PHP preg является PCRE, поэтому он должен поддерживать обходные пути.

регулярные ссылки-info.info

  • Lookaround
  • Сравнение вкусов
    • Функции PHP preg реализуют разновидность PCRE.
    • PCRE:
      • (?=regex) (положительный взгляд): ДА
      • (?<=text) (положительный взгляд сзади): исправлено + чередование

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

<?php

$haystack = '<a href="/foo.php">Go To Foo</a><a href="/bar.php">Go To Bar</a>';
$needle = '/(?<=href=").*?(?=">)/';
preg_match_all($needle,$haystack,$matches);
print_r($matches);     

?>

Запуск этого на ideone.com производит:

Array
(
    [0] => Array
        (
            [0] => /foo.php
            [1] => /bar.php
        )

)

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

В основном это Java, но часть регулярного выражения охватывает использование обходных путей / утверждений:

1 голос
/ 15 мая 2010

Вы можете использовать array_shift():

array_shift($matches);

но нет флага, чтобы сказать preg_match, что вы хотите.

В любом случае, поскольку вы знаете, что он будет всегда , вы должны быть в состоянии обработать это в своем коде. Зачем тебе это нужно?

1 голос
/ 15 мая 2010

Нет. Индекс 0 всегда будет совпадением текста, а не группы. Конечно, вы можете просто удалить первый элемент и изменить нумерацию массива.

...