2009-08-03 1 views
1

Мне нужно изменить элементы, которые окружают какое-то содержимое в строке, оставив контент как есть. Я делаю это с регулярным выражением, но когда я заменяю параметр positional ($ 1), он использует только первое совпадение.регулярное выражение: найти и заменить каждое соответствие

Например, если у меня есть эта строка:

<strong>I want</strong> to change <i>this</i> text, 
but <u>I can't</u>. <div class="question">Why?</div>. 

Я хочу изменить его на:

<strong>I want</strong> to change <i>this</i> text, 
but <u>I can't</u>. <div class="question">Why?</div>. 

Но я могу только получить это:

<strong>I want<strong> to change <strong>this<strong> text, 
but <strong>I can't<strong>. <strong>Why?<strong>. 

Я м с использованием следующего регулярного выражения:

\x26lt;(.*?)\x26gt; 

(глобально, и заменить его «<$1>»)

Я думаю, проблема в том, что я не могу сказать, сколько матчей будут найдены, и как обращаться к каждому из них. Возможно, в Perl я мог бы использовать $ +, но это не работает. Я делаю это с модулем регулярных выражений Yahoo Pipes. Это должно быть очень похоже на PHP-реализацию, afaik.

Как я могу использовать каждый матч отдельно в Yahoo Pipes?

ответ

2

Возможно, было бы проще заменить &lt; и &gt; самостоятельно. Таким образом, он становится просто find-replace, который не требует использования обратных ссылок.

+0

мне нужно сделать два прохода для этого? один для изменения < s и другой для > s? (спасибо!) –

+1

Было бы два прохода. Просто замените строку на < и >, а затем введите новую строку в веб-страницу. – mlevit

+0

Я не знаком с Yahoo Pipes, но большинство машин с регулярными выражениями заменяют все функциональные возможности. Вам придется «replaceAll» («<», «<») 'и' replaceAll («>», «>») ', так что да, потребуются две операции. –