Regex для удаления определенных переменных числовых значений из некоторого текста - PullRequest
0 голосов
/ 09 июня 2010

Я хочу заменить все 4 экземпляра числа 300 из приведенного ниже кода (который пользователи моего веб-сайта будут вставлять при создании нового сообщения в блоге) на 470.

<div>
  <object width="300" height="300">
    <embed src="link-removed" width="300" height="300"></embed>
  </object>
  <p>
    <a href="another-link">link</a>
  </p>
</div>

Ширина и высота вставляемого кода не всегда могут быть 300 на 300.

Так что я полагаю, что мне, вероятно, нужно регулярное выражение, которое будет содержать любое числовое значение, которое следует за строками "width =" и "height =", при этом не забывая учитывать кавычки, окружающие число. Может кто-нибудь сказать мне, если это лучший способ, и если так, что будет лучшим регулярным выражением?

В случае, если это имеет значение, вставляемый код хранится как «текст» в БД, а не как строка, так как он довольно длинный (я удалил несколько сотен символов из того, что вы видите вставленным здесь) ...

1 Ответ

5 голосов
/ 09 июня 2010

Вы можете найти (width|height)="\d+" и заменить его на $1="470". Это захватывает либо width, либо height в группу 1, и в замещающих строках вы ссылаетесь на эту захваченную строку как $1.

Шаблон может стать более сложным в зависимости от требования. Если вы хотите быть либеральным с пробелами, вы можете разрешить \s* вокруг =; например, для предотвращения сопоставления tablewidth="300" шаблону можно предшествовать \b и т. д.

Смотри также


О группах захвата

Конструкция (...) - это то, что называется "группой захвата".

С учетом этой тестовой строки:

i have 35 dogs, 16 cats and 10 elephants

Тогда (\d+) (cats|dogs) дает 2 результата матча ( см. На rubular.com )

  • Результат 1: 35 dogs
    • Группа 1 захватывает 35
    • Группа 2 захватывает dogs
  • Результат 2: 16 cats
    • Группа 1 захватывает 16
    • Группа 2 захватывает cats

Ссылки


в рубине

В замещающих строках Ruby использует \ вместо $ в качестве сигил для обратных ссылок на группы захвата.

ruby-doc.org - String#gsub: если в качестве замены используется строка, в нее нельзя подставить специальные переменные (например, $& и $1) , поскольку подстановка в строку происходит до начала сопоставления с образцом. Однако последовательности \1, \2 и т. Д. Могут использоваться для интерполяции последовательных групп в совпадении.

Таким образом, решение, которое вы ищете, выглядит примерно так:

text = 'blah blah width="300" and height="299" more blah'
puts text.gsub(/(width|height)="\d+"/, '\1="470"')

Это печатает ( как видно на ideone.com ):

blah blah width="470" and height="470" more blah
...