Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Заменить один тег на другой html (http://forum.oszone.net/showthread.php?t=234141)

Pavluha 06-05-2012 13:03 1911420

Заменить один тег на другой html
 
Здравствуйте. Мне нужно в html коде заменить тег
HTML код:

<span style="font-weight: bold;">текст</span>
(их может быть несколько) на
HTML код:

<b>текст</b>
Проблема в том, что тегов span в документе очень много: у меня не получается найти закрывающий тег (так как они очень часто влаживаются один в другой). Помогите, пожалуйста.

Creat0R 06-05-2012 15:31 1911464

Цитата:

Цитата Pavluha
нужно в 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($vTest, '<span style="[^"]*">|</span>', '')

ConsoleWrite("Result: " & $sRet & @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($vTest, '<span style="[^"]*">.*</span>', '')

ConsoleWrite("Result: " & $sRet & @LF)


Pavluha 06-05-2012 21:29 1911636

Creat0R, мне нужно сменить название тега, а не убрать его.

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

HTML код:

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

HTML код:

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

Creat0R 06-05-2012 21:55 1911654

Цитата:

Цитата Pavluha
мне нужно сменить название тега, а не убрать его »

Пока получилось только с циклом:

Код:

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

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

ConsoleWrite("Result: " & $vTest & @LF)


Pavluha 06-05-2012 22:37 1911680

а можно другие варианты, а то этот не работает правильно (только что заметил)

Creat0R 07-05-2012 02:06 1911735

Цитата:

Цитата Pavluha
можно другие варианты, а то этот не работает правильно »

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

gregaz 07-05-2012 06:28 1911746

Может так :?

Код:

$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 1911752

Цитата:

Цитата gregaz
Может так :? »

Оно не заменяет вложенные теги.

Pavluha 07-05-2012 17:04 1912014

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

Код:

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

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


Цитата:

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

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

Creat0R 07-05-2012 17:18 1912033

Цитата:

Цитата Pavluha
я придумал алгоритм, по которому можно 100% найти закрывающий тег »

Зачем что-то придумывать?
Я дал рабочий вариант, если нет хотя бы куска кода который показывает обратно, то не имеет смысла дальше что либо делать.

Цитата:

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

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

Pavluha 07-05-2012 18:00 1912063

Цитата:

Цитата Creat0R
Зачем что-то придумывать?
Я дал рабочий вариант, если нет хотя бы куска кода который показывает обратно, то не имеет смысла дальше что либо делать. »

вы увидите насколько он рабочий, если
HTML код:

$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 1912076

Цитата:

Цитата Pavluha
вы увидите насколько он рабочий, если »

Ну так тут совсем другие условия, тут есть 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 1912089

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

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

Creat0R 07-05-2012 18:31 1912094

Цитата:

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

А вы бы объясняли лучше, тогда может и пойму.
Поправил код.

Цитата:

Цитата Pavluha
доделайте мой скрипт, и всё будет норм. »

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

Iska 07-05-2012 18:32 1912096

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

Pavluha 07-05-2012 18:38 1912101

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

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

Pavluha 07-05-2012 19:37 1912130

Creat0R, что вам стоит доделать мой алгоритм. Мне и его будет достаточно.

Creat0R 08-05-2012 00:23 1912279

Цитата:

Цитата Pavluha
что тут не понятного? »

А что непонятного в том что я пишу?
Мой последний код не работает?

Цитата:

Цитата Pavluha
что вам стоит доделать мой алгоритм »

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

Pavluha 08-05-2012 14:58 1912515

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

Creat0R 08-05-2012 21:37 1912741

Цитата:

Цитата Pavluha
ваш скрипт все теги спан, у которых есть параметр стиль, заменяет на б. А мне нужно, чтобы заменяло только этот тег со стилем 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)


Pavluha 08-05-2012 22:22 1912780

Цитата:

Цитата Creat0R
Нужно было так и написать в первом сообщении. »

а что, я не так написал

а за код спасибо, правда уже сам написал)


Время: 00:23.

Время: 00:23.
© OSzone.net 2001-