регулярное выражение: выбор всего, кроме тега img - PullRequest
2 голосов
/ 05 декабря 2010

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

Я обнаружил следующий код, который выбирает все теги img:

/<img[^>]+>/g

, но на самом деле с таким текстом, как:

This is an untagged text.
<p>this is my paragraph text</p>
<img src="http://example.com/image.png" alt=""/>
<a href="http://example.com/">this is a link</a>

, используя код выше, выберет тег img only

/<img[^>]+>/g #--> using this code will result in:
<img src="http://example.com/image.png" alt=""/>

, но я хотел бы использовать некоторыерегулярное выражение, которое выбирает все, кроме изображения, например:

/magical regex/g # --> results in:
This is an untagged text.
<p>this is my paragraph text</p>
<a href="http://example.com/">this is a link</a>

Я также нашел этот код:

/<(?!img)[^>]+>/g

, который выбирает все tags, кроме img.но в некоторых случаях у меня будет тег или текст без тегов между тегами, так что это не будет работать для моего случая.: (

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

Заранее спасибо


ОБНОВЛЕНИЕ:

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

Другое дело, я не использую какой-либо конкретный язык, я использую Yahoo Pipes , которые предоставляют только регулярные выражения и некоторые строковые инструменты для выполнения работы, но не развиваютсяЛюбой программный код.

для лучшего понимания, вот как работает модуль регулярных выражений в каналах Yahoo:

http://pipes.yahoo.com/pipes/docs?doc=operators#Regex


ОБНОВЛЕНИЕ 2

К счастью, я могу удалить текст рядом с тегом img, но постепенно, как рекомендовано @Blixt, например:

<(?!img)[^>]+> , replace with "" #-> strips out every tag that is not img
(?s)^[^<]*(.*), replace with $1  #-> removes all the text before the img tag
(?s)^([^>]+>).*, replace with $1 #-> removed all the text after the img tag

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

Ответы [ 2 ]

1 голос
/ 05 декабря 2010

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

Если вы используете PHP:

$htmlWithoutIMG = preg_replace('/<img[^>]+>/g', '', $html);

Если вы используете Javascript:

var htmlWithoutIMG = html.replace(/<img[^>]+>/g, '');

Это берет ваш текст, находит теги <img> и заменяет их ничем, т.е.он удаляет их из текста, оставляя то, что вы хотите.Не могу вспомнить, нужно ли бежать <,>.

0 голосов
/ 05 декабря 2010

Регулярные выражения имеют одинаковое начало и длину.Это означает, что желаемый результат невозможен в одном совпадении (поскольку вы хотите, чтобы результат заканчивался в одной точке, а затем продолжался позже).

Самое близкое, что вы можете получить, - это использовать регулярное выражение, которое соответствует всемначало строки до начала тега <img>, все между тегами <img> и все от конца тега <img> до конца строки.Затем вы можете получить все совпадения из этого регулярного выражения (в вашем примере будет два совпадения).

Приведенный выше ответ предполагает, что вы не можете изменить результат.Если вы можете изменить результат, просто замените теги <img> пустой строкой, чтобы получить свой результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...