Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Usuwanie tagu z atrybutów tagu
hobibit
post
Post #1





Grupa: Zarejestrowani
Postów: 23
Pomógł: 0
Dołączył: 22.03.2008

Ostrzeżenie: (0%)
-----


Witam. Mam problem i nie wiem jak go rozwiązać. Pewnie trzeba użyć wyrażeń regulanych, ale nie udało mi sięnapisać takiego które by zadziałało poprawnie.
Mam taką sytułację:
  1. <div atrybut="wartosc1 <b>wartosc2</b> wartosc3" <b>coś</b> inny_atrybut="inna_wartosc" >dowolna treść</div>

Jak widać tag <b> jest wstawiony w atrybutach <div>, tak być nie powinno, chcę go usunąć razem z zawatrością żeby otrzymać:
  1. <div atrybut="wartosc1 wartosc3" inny_atrybut="inna_wartosc" >dowolna treść</div>

Jednak artybuty i ich wartości się zmieniają, czyli nie ma tak że klasa jest zawsze pierwsza a id drugie, mogą występować w dowolnej kolejności i mogą się pojawić jeszcze inne atrybuty.

Co zrobić żeby usunąć tag <b> z atrybutów innego tagu?

Ten post edytował hobibit 24.07.2013, 11:28:24
Go to the top of the page
+Quote Post
Damonsson
post
Post #2





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


Wszystkie <b> z zawartością tak:
  1. \<b\>(.*?)\<\/b\>


Chyba, że jeszcze chcesz określać, że tylko w konkretnych atrybutach, no to dodaj sobie przed w jakich i tyle.
Go to the top of the page
+Quote Post
hobibit
post
Post #3





Grupa: Zarejestrowani
Postów: 23
Pomógł: 0
Dołączył: 22.03.2008

Ostrzeżenie: (0%)
-----


Tylko że twój kod wyrzuci wszystkie <b>, ja chce usunąć tylko te które są podane w miejscu atrybutów.
A jeśli rozbuduje wyrażenie tak że będzie łąpać dodatkowo diva w stylu:
  1. \<div\>(.*?)\<b\>(.*?)\<\/b\>(.*?)<\/div\>

To usunie mi też diva, a ja chce usunąć <b> z atrybutów a nie uwuwać <b> poza atrybutami ani całych div-ów w których jest <b>. Też inne atrybuty które ma div powinny pozostać nie naruszone.

Ten post edytował hobibit 24.07.2013, 12:03:01
Go to the top of the page
+Quote Post
IProSoft
post
Post #4





Grupa: Zarejestrowani
Postów: 479
Pomógł: 97
Dołączył: 6.09.2011
Skąd: php.net :)

Ostrzeżenie: (0%)
-----


Jeśli tylko z atrybut
  1. echo preg_replace('@atrybut="([^<]+)<b>([^<]+)</b>([^"]+)"@', 'atrybut="\\1\\3"', '<div atrybut="wartosc1 <b>wartosc2</b> wartosc3" <b>coś</b> inny_atrybut="inna_wartosc" >dowolna treść</div>' )


--------------------
Manual prawdę Ci powie.
Go to the top of the page
+Quote Post
hobibit
post
Post #5





Grupa: Zarejestrowani
Postów: 23
Pomógł: 0
Dołączył: 22.03.2008

Ostrzeżenie: (0%)
-----


Nie nie tylko z atrybutów.
Mam już prawie działający kod:
  1. $content = '111 <div style="color:red<b>222</b>" 333 <b>444</b> 555>666</div> <b>777</b> 888';
  2. preg_replace('/<([^<^>]+)<b>.+?<\/b>([^>]+)>/', '<\\1\\2>', $content);


Jednak ma wadę. Kiedy w jednym tagu występuje więcej niż jedno <b>tresc</b> to usuwa tylko jedno (pierwsze).

Czy jest jakaś opcja że w wyrażeniu regularnym używam zagnieżdzonych nawiasów (), tylko jak się odwołać wtedy do jednego z nawiasów w środku
  1. ((a)(b))
? gdybym zwrócił \\1 to wypluje 'ab', co zrobić żeby zwróciło tylko 'a':
  1. <([^<^>]+) ( (<b>.+?<\/b>) ([^>]+) )+ >


Ten post edytował hobibit 24.07.2013, 14:24:54
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.08.2025 - 13:39