2016-01-20 2 views
0

Я думал, что знаю регулярные выражения, но я не могу это исправить.Regex только захватывает последний элемент в группе

Попытка получить 56 из этого.

$s = '<a href="../paye/56.html">'; 

Со следующим Regex (PHP - preg_match)

preg_match('/href="(.*(\d+)\.html)"/',$s,$m); 

Но это только дает мне 6

[ 
0 => 'href="../paye/56.html"', 
1 => '../paye/56.html', 
2 => '6' // Need this to be 56 
] 

Regex 101 пытается помочь с

Повторная группа захвата будет захватывать только последняя итерация. Поместите в группу захвата вокруг повторяющейся группы, чтобы захватить все итерации или используйте не захватив группу вместо этого, если вы не заинтересованы в данных

Но все мои попытки положить захват группы вокруг этого захвата не изменили ситуацию.

+0

Извините опечатка, регулярное выражение я пытался было preg_match ; – Tim

ответ

1
  1. (\d)+ будет соответствовать одной цифре и поместить его в группу захвата, то + квантор будет соответствовать любой цифре, но не захватит его. Чтобы захватить все цифры, переместите квант + внутри группы захвата.
  2. Сделайте первую часть .* неживой, используя ? в конце.

Вам не нужна скобка вокруг всей строки. Чтобы зафиксировать только последнюю часть URL-адреса.

href=.*?(\d+)\.html 
    ^^

И получить доступ к первой захваченной группе.

код: (' ". (* (\ D +) \ HTML)"/HREF = /', $ s, $ м)

$re = "/href=.*?(\\d)+\\.html/"; 
$str = "\$s = '<a href=\"../paye/56.html\">';"; 

preg_match($re, $str, $matches); 
+0

[RegEx Demo] (https://regex101.com/r/cO1aS7/2) – Tushar

+0

Спасибо, это бит, который мне не хватало. «Сделайте первую часть.», Не жадный, используя «в конце». – Tim

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