Моя первая попытка использования 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/