Войти

Показать полную графическую версию : [решено] Заменить один тег на другой html


Страниц : [1] 2

Pavluha
06-05-2012, 13:03
Здравствуйте. Мне нужно в html коде заменить тег <span style="font-weight: bold;">текст</span> (их может быть несколько) на <b>текст</b> Проблема в том, что тегов span в документе очень много: у меня не получается найти закрывающий тег (так как они очень часто влаживаются один в другой). Помогите, пожалуйста.

Creat0R
06-05-2012, 15:31
нужно в html коде заменить тег »
Только тег, или всё его содержимое?

Если первое, тогда так:
$vTest = 'some code <span style="font-weight: bold;">span content <span style="">included span content other span content</span> some code'</span>

$sRet = StringRegExpReplace (http://autoit-script.ru/autoit3_docs/functions/StringRegExpReplace.htm)($vTest, '<span style="[^"]*">|</span>', '')

ConsoleWrite (http://autoit-script.ru/autoit3_docs/functions/ConsoleWrite.htm)("Result: " & $sRet & @LF (http://autoit-script.ru/autoit3_docs/macros.htm#@lf))

Если второе, тогда так:
$vTest = 'some code <span style="font-weight: bold;">span content <span style="">included span content other span content</span> some code'</span>

$sRet = StringRegExpReplace (http://autoit-script.ru/autoit3_docs/functions/StringRegExpReplace.htm)($vTest, '<span style="[^"]*">.*</span>', '')

ConsoleWrite (http://autoit-script.ru/autoit3_docs/functions/ConsoleWrite.htm)("Result: " & $sRet & @LF (http://autoit-script.ru/autoit3_docs/macros.htm#@lf))

Pavluha
06-05-2012, 21:29
Creat0R, мне нужно сменить название тега, а не убрать его.

То есть, мне нужно превратить это:

some <span style="font-weight: bold;">text and <span style="font-weight: italic;">more</span></span>

в:

some <b>text and <span style="font-weight: italic;">more</span></b>

Creat0R
06-05-2012, 21:55
мне нужно сменить название тега, а не убрать его »
Пока получилось только с циклом:

$vTest = 'some code <span style="font-weight: bold;">span content <span style="">included span content other span content</span> some code</span>'

While (http://www.autoitscript.com/autoit3/docs/keywords.htm#While) 1
$vTest = StringRegExpReplace (http://autoit-script.ru/autoit3_docs/functions/StringRegExpReplace.htm)($vTest, '<span style="[^"]*">(.*(?=</span>))</span>', '<b>\1</b>')
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) @extended (http://autoit-script.ru/autoit3_docs/macros.htm#@extended) = 0 Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) ExitLoop (http://www.autoitscript.com/autoit3/docs/keywords.htm#ExitLoop)
WEnd (http://www.autoitscript.com/autoit3/docs/keywords.htm#WEnd)

ConsoleWrite (http://autoit-script.ru/autoit3_docs/functions/ConsoleWrite.htm)("Result: " & $vTest & @LF (http://autoit-script.ru/autoit3_docs/macros.htm#@lf))

Pavluha
06-05-2012, 22:37
а можно другие варианты, а то этот не работает правильно (только что заметил)

Creat0R
07-05-2012, 02:06
можно другие варианты, а то этот не работает правильно »
Код с которым нужно работать, в студию.

gregaz
07-05-2012, 06:28
Может так :?

$sText='<title>Заменить один тег на другой html</title>' & @CRLF & _
'some <span style="font-weight: bold;">text and <span style="font-weight: italic;">more</span></span>' & @CRLF & _
'some <span style="font-weight: bold;">====text1==== and <span style="font-weight: italic;">more</span></span>' & @CRLF & _
'some <span style="font-weight: bold;">*****text2**** and <span style="font-weight: italic;">more</span></span>'

$sNewTag="b"

$sPatern = '<(?:span.*?bold;")>(.+)<(?:/span)>'
$sResult = StringRegExpReplace( $sText, $sPatern,"<" & $sNewTag & ">$1</" & $sNewTag & ">" )
MsgBox(4096, ' Test Result', $sResult)

Creat0R
07-05-2012, 07:20
Может так :? »
Оно не заменяет вложенные теги.

Pavluha
07-05-2012, 17:04
Creat0R, gregaz, я придумал алгоритм, по которому можно 100% найти закрывающий тег, он есть конечно :), но не могу сам написать. Примерно так:


$iPos = StringInStr ($sString, '<span style="font-weight: bold;">')
$iTags = 0
While $iTags<>-1
(тут идём дальше по файлу. если видим закрывающийся
тег, то $iTags уменьшаем на 1, а если открывающийся, то
увеличиваем на 1. Цикл закончится, когда найдём
правильный закрывающийся тег. Надо найти его позицию.)
WEnd


единственное, что надо учесть при написании -- могут быть одинарные теги.


Код с которым нужно работать, в студию. »

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

Creat0R
07-05-2012, 17:18
я придумал алгоритм, по которому можно 100% найти закрывающий тег »
Зачем что-то придумывать?
Я дал рабочий вариант, если нет хотя бы куска кода который показывает обратно, то не имеет смысла дальше что либо делать.

прога будет работать с обыкновенным хтмл кодом, она будет копировать с нужного сайта новость или что-то другое »
Пример такого кода можно увидеть?
Ты написал что вариант работает неправильно, покажи с каким кодом.

Pavluha
07-05-2012, 18:00
Зачем что-то придумывать?
Я дал рабочий вариант, если нет хотя бы куска кода который показывает обратно, то не имеет смысла дальше что либо делать. »

вы увидите насколько он рабочий, если $vTest = 'some code <span style="align: center;"><span style="font-weight: bold;"><span style="font-weight: italic;">included span content other span content</span></span></span>'

приблизительно такой код был на сайте.

Creat0R, доделайте мой код, пожалуйста, и тема будет решена.

Creat0R
07-05-2012, 18:12
вы увидите насколько он рабочий, если »
Ну так тут совсем другие условия, тут есть align, также тут не кавычек у параметров.

Вот рабочий вариант:

$vTest = 'some code <span align=center><span style="font-weight: bold;"><span style="font-weight: italic;">included span content other span content</span></span></span>'

While 1
$vTest = StringRegExpReplace($vTest, '<span style="?[^">]*"?>(.*?)</span>', '<b>\1</b>')
If @extended = 0 Then ExitLoop
WEnd

ConsoleWrite($vTest & @LF)

Pavluha
07-05-2012, 18:25
Creat0R, вы не понимаете. мне нужно заменить только тег <span style="font-weight: bold;"> , а остальные не трогать.

Вообще, доделайте мой скрипт, и всё будет норм. Мне будет достаточно для моих манипуляций с тегами.

Creat0R
07-05-2012, 18:31
вы не понимаете. мне нужно заменить только тег <span style="font-weight: bold;"> , а остальные не трогать. »
А вы бы объясняли лучше, тогда может и пойму.
Поправил код.

доделайте мой скрипт, и всё будет норм. »
Там нечего доделывать, т.к код неверный, как в принципе и сам алгоритм. Для таких задач используются рег. выражения.

Iska
07-05-2012, 18:32
Pavluha, это Вы не понимаете, что работа regexp'ов критично зависит от исходного материала. Надо сразу озвучивать условия техзадания целиком и полностью, а не в час по чайной ложке.

Pavluha
07-05-2012, 18:38
Creat0R, Iska, что тут не понятного? просто найти тег <span style="font-weight: bold;">text</span> и заменить его на <b>text</b>.

ТОЛЬКО тег <span style="font-weight: bold;"> , а не все спаны

Pavluha
07-05-2012, 19:37
Creat0R, что вам стоит доделать мой алгоритм. Мне и его будет достаточно.

Creat0R
08-05-2012, 00:23
что тут не понятного? »
А что непонятного в том что я пишу?
Мой последний код не работает?

что вам стоит доделать мой алгоритм »
Зачем новый велосипед делать, есть уже инструменты для этой задачи.

Pavluha
08-05-2012, 14:58
Creat0R, читайте полностью что я пишу: ваш скрипт все теги спан, у которых есть параметр стиль, заменяет на б. А мне нужно, чтобы заменяло только этот тег со стилем font-weight: bold; . Неужнли не понятно?

Creat0R
08-05-2012, 21:37
ваш скрипт все теги спан, у которых есть параметр стиль, заменяет на б. А мне нужно, чтобы заменяло только этот тег со стилем font-weight: bold; »
Нужно было так и написать в первом сообщении.

$vTest = 'some code <span align=center><span style="font-weight: bold;"><span style="font-weight: italic;">included span content other span content</span></span></span>'

$iOccurrense = -1

While 1
$iStartPos = StringInStr($vTest, '<span ', 0, $iOccurrense)
If Not $iStartPos Then ExitLoop

$iClosePos = StringInStr($vTest, '</span>', 0, -$iOccurrense, $iStartPos - 1)
$sTmp = StringMid($vTest, $iStartPos, $iClosePos - $iStartPos + 7)

$vTest = StringReplace($vTest, $sTmp, StringRegExpReplace($sTmp, '<span style="font-weight: bold;">(.*)</span>', '<b>\1</b>', 1), 1)
$iOccurrense -= 1
WEnd

ConsoleWrite($vTest & @LF)




© OSzone.net 2001-2012