Regex - получение кратчайшего текста, содержащего данный токен - PullRequest
0 голосов
/ 13 декабря 2011

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

Редактировать: Пожалуйста, не жалуйтесь на мой разбор HTML :) Та же самая ситуация может быть воспроизведена простым текстом:

Предполагаемая исходная строка:

Lorem 1 ipsum. Lorem 2 ipsum TOKEN 
foo. Lorem 3 ipsum

Предполагаемая исходная строка HTML версия:

<div id="entry-1">Lorem ipsum</div>
<div id="entry-2">Lorem ipsum TOKEN</div>
<div id="entry-3">Lorem ipsum</div>

Что я хочу получить:

2 , потому что это «Lorem ipsum» содержит токен.

Я пытаюсь использовать его: /([0-9]+).*TOKEN/sm, но я получаю 1, потому что он начинает искать TOKEN после нахождения первой «цифры», то есть1.

С помощью двух разделенных регулярных выражений regex / preg_match это легко, но мне интересно, можно ли улучшить этот подход.

Заранее спасибо за вашу помощь:)

Ответы [ 3 ]

2 голосов
/ 13 декабря 2011

Попробуйте не жадный *

/entry-([0-9]+).*?TOKEN/sm

Не работает на всех платформах, но он может работать в этом (это javascript?)

0 голосов
/ 13 декабря 2011

Ваше регулярное выражение верно, но проблема в модификаторе s, который заставляет . совпадать и с новой строкой, и это делает ваше регулярное выражение совпадением с 1. Бросьте s.

Также вам не нужен модификатор m, так как вы не используете якоря в своем регулярном выражении.

Смотри

В этом ответе предполагается, что entry-[0-9] и TOKEN находятся на одной строке на входе.

0 голосов
/ 13 декабря 2011

Я бы использовал позитивный взгляд, чтобы убедиться, что вы подходите TOKEN, например:

<div id="entry-([0-9]+)">.*(?<=TOKEN)</div>

Вы можете использовать это так:

$result = preg_match('%<div id="entry-([0-9]+)">.*(?<=TOKEN)</div>%i', $subject, $matches);

Это будет соответствовать второму примеру, но не первому или третьему.

...