Регулярные совпадения пробелов в атрибуте html - PullRequest
1 голос
/ 14 мая 2009

У меня есть куча HTML с такими строками:

<a href="#" rel="this is a test">

Мне нужно заменить пробелы в атрибуте rel символами подчеркивания, но я как бы regex-noob!

Я использую Textmate.

Кто-нибудь может мне помочь?

/ Jakob

Ответы [ 6 ]

0 голосов
/ 17 апреля 2016

Найти: (rel="[^\s"]*)\s([^"]*")

Заменить: \1_\2

Это заменяет только первый пробел, поэтому нажимайте «Заменить все», пока ничего не замените. Это не красиво, но легко понять и работает с каждым редактором.

Измените rel в шаблоне поиска, если вам нужно очистить другие атрибуты.

0 голосов
/ 14 мая 2009

Если вы используете TextMate, то вы на Mac, и, следовательно, у вас есть Python.

Попробуйте это:

#!/usr/bin/env python

import re

input = open('test.html', 'r')

p_spaces = re.compile(r'^.*rel="[^"]+".*$')

for line in input:
    matches = p_spaces.findall(line)

    for match in matches:
        new_rel = match.replace(' ', '_')
        line = line.replace(match, new_rel)

    print line,

Пример вывода:

 $ cat test.html
testing, testing, 1, 2, 3
<a href="#" rel="this is a test">
<unrelated line>
Stuff
<a href="#" rel="this is not a test">
<a href="#" rel="this is not a test" rel="this is invalid syntax (two rels)">
aoseuaoeua

 $ ./test.py
testing, testing, 1, 2, 3
<a_href="#"_rel="this_is_a_test">
<unrelated line>
Stuff
<a_href="#"_rel="this_is_not_a_test">
<a_href="#"_rel="this_is_not_a_test"_rel="this_is_invalid_syntax_(two_rels)">
aoseuaoeua
0 голосов
/ 14 мая 2009

Мне нужно попасть на поезд "вы используете не тот инструмент, который нужен для работы" здесь. У вас есть Textmate, что означает OSX, то есть у вас есть sed, awk, ruby ​​и perl, которые могут сделать это намного лучше и проще.

Изучение того, как использовать один из этих инструментов для манипулирования текстом, даст вам бесчисленные преимущества в будущем. Вот URL-адрес, который облегчит вам задачу sed: http://www.grymoire.com/Unix/Sed.html

0 голосов
/ 14 мая 2009

Регулярные выражения в принципе плохо разбирают HTML (см. . Можете ли вы привести некоторые примеры того, почему трудно анализировать XML и HTML с регулярным выражением? , почему). Что вам нужно, это HTML-парсер. См. Можете ли вы привести пример разбора HTML с вашим любимым парсером? для примеров использования различных парсеров.

0 голосов
/ 14 мая 2009

Я не думаю, что вы можете сделать это правильно. Хотя мне интересно, почему вы должны сделать это за один раз?

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

Вы могли бы сделать это с помощью регулярного выражения ниже. Тем не менее, вам придется увеличить количество захватов и выходов с _ на конце до потенциального числа пробелов в rel. Могу поспорить, что это требование, которое запрещает это решение.

Поиск:

{\<a *href\=\"[^\"]*" *rel\=\"}{([^ ]*|[^\"]*)}( |\")*{([^ ]*|[^\"]*)}( |\")*{([^ ]*|[^\"]*)}( |\")*{([^ ]*|[^\"]*)}( |\")*{([^ ]*|[^\"]*)}( |\")*{([^ ]*|[^\"]*)}( |\")*{([^ ]*|[^\"]*)}( |\")*{([^ ]*|[^\"]*)}( |\")*

Заменить:

\1\2_\3_\4_\5_\6_\7_\8_

У этого способа есть два недостатка: во-первых, могут быть ограничения на количество снимков, которые вы можете иметь в Textmate, и два - это то, что у вас будет большое количество _ в конце каждой строки.

В текущем тесте с приведенным выше регулярным выражением вы получите:

<a href="#" rel="this_is_a_test">____

PS: это регулярное выражение имеет формат окна поиска / замены визуальной студии. Возможно, вам придется изменить некоторые символы, чтобы он соответствовал текстовой панели.

 {} => capturing group

  () => grouping

  [^A] => anything but A

  ( |\")* => space or "

  \1 => is the first capture 
0 голосов
/ 14 мая 2009

Предположим, вы уже получили значение rel:

var value = document.getElementById(id).getAttribute( "rel");
var rel = (new String( value)).replace( /\s/g,"_");
document.getElementById(id).setAttribute( "rel", rel);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...