LINUX.ORG.RU

Помогите составить регулярное выражение


0

1

Здравствуйте всем!

Есть повторяющаяся строка вида: "[tag]Какой-то текст<p> </p>Ещё какой-то текст[/tag]" Задача в том, чтобы теги <p> и </p> заменить на ", т.е. убрать, но обязательно в пределах строки [tag]...[/tag]. В итоге должно получиться так: "[tag]Какой-то текст Ещё какой-то текст[/tag]"

Уважаемые, помогите составить регулярку, наверняка она несложная, но у меня пока возникают трудности с ней

Ответ на: комментарий от Apple-ch

тогда тем более прошу помощи сообщества. есть вариант циклом с подстроками работать, но это скорее всего будет менее производительно

wertklop
() автор топика
Ответ на: комментарий от wertklop

не знаю php. В любом случае, этот вариант медленно работает, я бы стейт-машиной с входным алфавитом мощности 4 сделал бы:

  1. [tag]
  2. [/tag]
  3. (<p>|</p>)
  4. всё остальное
NeXTSTEP ★★
()
Ответ на: комментарий от wertklop

Тогда надо кое-что прояснить.

Первое: тэг может быть любым([foo], [bar], etc) или [tag] — единственное возможное значение?

Второе: могут ли быть вложенные тэги?

Apple-ch ★★
()
Ответ на: комментарий от Apple-ch

1)только tag - единственное возможное значение 2)на данном этапе внутри только текст и другие html-теги, которые трогать нельзя, кроме p-тега. его нужно удалить, а содержимое в нем оставить без изменений

wertklop
() автор топика
Ответ на: комментарий от anTaRes

на консоли «<pre>Какой-то текст<p> </p>Ещё какой-то текст</pre>». «<p> </p>» не заменяется на " "

wertklop
() автор топика
Ответ на: комментарий от wertklop

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

Лучше напиши простенький парсер.

Apple-ch ★★
()
Ответ на: комментарий от wertklop

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

Там больше времени уйдет на составление RegExp и пляску вокруг него, чем использование DOM.

frozenix ★★★
()

еще подсказки:
если подумать головой и правильно поставить задачу - звучать она будет примерно так:
«нужно найти все что заключено в теги [tag][/tag] и удалить в найденном все html теги <p></p>»
пусть будет так, примерно

а теперть нужно перевести это на пхп, или какой другой изыг:
"найти все что заключено в теги [tag][/tag]" , "удалить в найденном все html теги <p></p>"

з.ы. колл-бэки использовать не запрещено

anTaRes ★★★★
()
Ответ на: комментарий от frozenix

Этот DOM-парсер умеет парсить <a><b></a></b>? А то перловый TreeBuilder не умеет и для парсинга одного китайского сайта мне пришлось препроцессор на регэкспах писать, который тупо удалял все оформительские теги, которые и перекрещивались в куче мест.

redgremlin ★★★★★
()

install flex and gcc

file: change.l

%x change
%%
\[tag\]		    {BEGIN(change); printf("%s", yytext);}
<change>\<\/?p\>    {printf(",");}
\[\/tag\]           {BEGIN(INITIAL);}
%%
main()
{
  yylex();
}

compile:

flex change.l
gcc -O2 -o change lex.yy.c -lfl

run:

./change < input.txt > output.txt

sdio ★★★★★
()
Последнее исправление: sdio (всего исправлений: 1)
Ответ на: комментарий от redgremlin

Не должен он это парсить.

Тут нужно сделать две вещи - вырвать руки тому, кто это написал и использовать какого-то рода SAX парсер.

frozenix ★★★
()
Ответ на: комментарий от wertklop

А с какой целью-то? А то вдруг хватит средств css2: вместо tag использовать span, p внутри отображать как inline и добавлять :before|after content.

anonymous
()
Ответ на: комментарий от anonymous

Спасибо большое! и как я раньше не додумался, просто назначу стиль для тега р такой, чтобы отображалось как надо. но для php-скрипта все-таки попробую найти решение

wertklop
() автор топика

еще подсказки:
«найти ...» == '|\[tag\].*?\[/tag\]|' , например

anTaRes ★★★★
()
Ответ на: комментарий от quantum-troll

ну можно сначало 1,$j

а затем s/чудо_в_окружении/окружение_без_чуда/g

для тегированного переводы строк пробелы (ежель только не «pre»)

так что можно и седом.

qulinxao ★★☆
()

... php.net/manual-lookup.php?pattern=_callback ...

anTaRes ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.