Intereting Posts

Справка с Regex – WordPress (search-regex)

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

provide brand-strengthening efforts for the 10-school conference.  </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" 

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

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

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

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

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

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

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

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

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

 /(6a00d834.*?)"/ 

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

 /6a00d834.*?(")/ 

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

 '\\1.jpg"' 

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

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

 / 6a00d834 [^ "] *" /

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

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

 $ cat input
 6a00384foo "больше"
 $ perl -ne '/ (6a00384 [^ "] *") /;  print "$ 1 \ n" '
 6a00384foo»
 $ perl -ne '/(6a00384.*?")/; print "$ 1 \ n"' input
 6a00384foo»
 $ sed 's / \ (6a00384 [^ "] *" \). * / \ 1 /'
 6a00384foo»
 $ sed 's / \ (6a00384. *? "\). * / \ 1 /'
 6a00384foo "больше"

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

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

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

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

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

 /6a00d834.*?(")/ 

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

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

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

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