Регулярное выражение - поиск и замена текста между узлами за один шаг - PullRequest
0 голосов
/ 26 августа 2010

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

Учитывая:

<x>This text</x>
<!-- Unknown number of nodes between <x> and <y> -->
<y>Junk</y>

Изменить на:

<x>This text</x>
<!-- Unknown number of nodes between <x> and <y> -->
<y>This text</y>

Обычно, я бы сделал регулярное выражение для поискасодержимое х и сохранить его в переменной.Затем я бы запустил второе регулярное выражение, чтобы найти содержимое y и заменить его данными переменной.Просто интересно, есть ли «одношаговое» решение ... Спасибо.

Ответы [ 4 ]

3 голосов
/ 26 августа 2010

Если вы используете JQuery, вы можете просто сделать это:

$('y').html($('x').html());

В противном случае, со стандартным JavaScript:

document.getElementsByTagName('y')[0].innerHTML = document.getElementsByTagName('x')[0].innerHTML;
2 голосов
/ 26 августа 2010
$filecontents =~ s!(<x>(?>(.*?)</x>)(?>.*?<y>))(?>.*?(</y>))!$1$2$3!s;

Но вам лучше использовать синтаксический анализатор XML (при условии, что это XML). Например, приведенное выше не будет работать с вашим примером текста, потому что он будет думать, что <y> в комментарии является началом тега y.

0 голосов
/ 26 августа 2010

Мне удалось связаться с другом по этому поводу.

RegEx, предполагая, что только один узел x и один y, будет выглядеть следующим образом.

s/X([^X]*)X([^Y]*)Y([^Y]*)Y/X\1X\2Y\1Y/

, где X - <x> и Y <y>

0 голосов
/ 26 августа 2010

Если у вас есть строка, которую вы хотите заменить, похоже, это работает.

<script>
    var text = "<x>This text<x>\n<y>Junk<y>";
    var replaced = text.replace(/<x>(.*)<x>\n<y>.*<y>/s, "<x>$1</x>\n<y>$1</y>");
    alert(replaced);
</script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...