Регулярные выражения (PHP / Perl) Обратные ссылки - PullRequest
0 голосов
/ 30 ноября 2011

Я хочу сопоставить строки вида:

Разделы 158, 417, 418, 500, 501 и 1111

Где я получаю все числа в виде обратных ссылок (заменяя их гиперссылками). Я получил это далеко:

$text = preg_replace_callback("/Sections? ([0-9.]+)(?:(?:and|,| |or)+([0-9.]+))+/","hyperlink_me", $text); 

Это PHP (который использует регулярные выражения, совместимые с perl). Часть PHP хороша, я думаю, это регулярное выражение, которое не делает то, что я хочу, но я даю всю строку кода для контекста.

Проблема в том, что только две обратные ссылки, которые я получаю (кроме всей строки), относятся к первому числу («158») и последнему («1111»). Похоже, что вторая захваченная обратная ссылка ("([0-9.] +") Просто перезаписывается со второго числа и далее. Начиная с этой страницы , в разделе "Повторение и обратные ссылки" я получаю Идея, что это часто проблема, но не может понять, как решить ее в этом контексте. Любые гении-регулярники, которые могут помочь?

1 Ответ

1 голос
/ 30 ноября 2011

Это просто, как работают захватывающие скобки, и их нельзя избежать. Но вы можете создать «вспомогательный» обратный вызов hyperlink_us, который делает это:

$output = preg_replace_callback("/[^0-9.]+([0-9.]+)/","hyperlink_me", $input);

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

$text = preg_replace_callback("/(Sections? [0-9.]+(?:(?:and|,| |or)+[0-9.]+)+)/","hyperlink_us", $text);

Таким образом, hyperlink_us передает все числа в hyperlink_me, но вызывающий hyperlink_us может убедиться, что числа передаются только в соответствующих контекстах (материал "Section (s) ...") .

(Отказ от ответственности: я не сильно разбираюсь в PHP. Я предполагаю, что эта функция ведет себя как ее аналог в JavaScript. Я знаю Perl, но у нее нет функции замены на основе обратного вызова, основанной на регулярном выражении .)

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