Помощь с регулярным выражением - Wordpress (поиск-регулярное выражение) - PullRequest
4 голосов
/ 01 августа 2009

Моя первая попытка использования RE застряла. Я использую Regex на веб-сайте Wordpress через Плагин Search-Regex , и мне нужно сопоставить его с определенным «скрытым в куче HTML-кода.

provide brand-strengthening efforts for the 10-school conference.&#0160; </p>
<p>
   <a href="http://www.learfield.com/oldblog/.a/6a00d8345233fa69e201157155a6fc970c-pi">
   <img alt="MOvalleyConf500" 
        border="0" 
        class="at-xid-6a00d8345233fa69e201157155a6fc970c"
        src="http://www.learfield.com/oldblog/.a/6a00d8345233fa69e201157155a6fc970c-800wi" 
        style="border: 1px solid black; margin: 0px; width: 502px; height: 384px;"             
        title="MOvalleyConf500" />
   </a>
</p>
<p>The photo above

В приведенном выше примере есть три цели

6a00d8345233fa69e201157155a6fc970c-pi"
6a00d8345233fa69e201157155a6fc970c"
6a00d8345233fa69e201157155a6fc970c-800wi"

Используемое мной регулярное выражение - /6a00d834.*?"/, оно находит их, однако я хочу сопоставлять только по окончанию ", а не по всей строке. Это изображения, у которых отсутствует расширение файла, поэтому мне нужно заменить окончание «на .jpg». Я понимаю заменяющую часть выражения, это начальное совпадение, с которым у меня возникли проблемы.

У меня есть куча таких (221), все цели начинаются с 6a00d834, а затем случайные буквенно-цифровые цифры, заканчивающиеся на "

Ценю любое понимание. Благодарю.

Редактирование добавлено из комментария ОП : На самом деле это сайт Wordpress, использующий плагин (REGEX) для запроса и замены данных в SQL. Я могу использовать любое Perl-совместимое регулярное выражение. (Примечание редактора - в зависимости от плагина, скорее всего, на самом деле это не Perl, а PHP-реализация PCRE.)

Ответы [ 5 ]

4 голосов
/ 01 августа 2009

Замена строки может быть выполнена вместе с соответствием. Поскольку вы используете PHP, используйте preg_replace

$newstring = preg_replace("/(6a00d834.*?)(\")/", "\\1.jpg\\2", $oldstring)

Это разбивает совпадение на две группы, а затем вставляет между ними «.jpg».

Для плагина регулярных выражений wordpress , используйте /(6a00d834.*?)(")/ для строки соответствия, а затем используйте \ 1.jpg \ 2 для строки замены.

2 голосов
/ 01 августа 2009

Разве это не сработает?

/(6a00d834.*?)"/

Редактировать: Вы сказали в одном из своих комментариев, что хотите заменить " на .jpg"; в этом случае это регулярное выражение, вероятно, будет работать:

/6a00d834.*?(")/

Однако лучше всего использовать первое предоставленное мной регулярное выражение и использовать строку замены, которая выглядит следующим образом:

'\\1.jpg"'

Конечно, \\1 должен быть заменен тем, что вы используете для обратных ссылок в вашем конкретном движке регулярных выражений.

1 голос
/ 01 августа 2009

Ваш вопрос не совсем понятен, но, возможно, вы имеете в виду:

/6a00d834[^"]*"/

(То есть: соответствует 6a00d834, за которым следует ноль или более символов, которые не являются "сопровождаемыми")

Кроме того, если он доступен в используемом вами механизме регулярных выражений, вы можете использовать не жадный спецификатор, чтобы ограничить метасимвол '*'. Имейте в виду, что любой вопрос о регулярных выражениях зависит от используемого вами движка. Например:

$ cat input
6a00384foo" more"
$ perl -ne '/(6a00384[^"]*")/; print "$1\n"' input
6a00384foo"
$ perl -ne '/(6a00384.*?")/; print "$1\n"' input
6a00384foo"
$ sed 's/\(6a00384[^"]*"\).*/\1/' input
6a00384foo"
$ sed 's/\(6a00384.*?"\).*/\1/' input
6a00384foo" more"

Обратите внимание, что '?' не служит ненадежным спецификатором в sed.

0 голосов
/ 01 августа 2009

Я предполагаю, что вы хотите извлечь все после 6a00d834 до первого следующего ". Итак, попробуйте это:

/6a00d834([^"]*)"/

Совпадение первой группировки будет той строкой, которую вы ищете.

0 голосов
/ 01 августа 2009

Возможно использовать групповой оператор?

/6a00d834.*?(")/

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

Редактировать

Ах, вы хотите заменить строку. Я предполагаю, что вы используете Perl. Попробуйте это:

s/(6a00d834.*?)(")/\1.jpg\2/
...