Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Usuwanie tagu z atrybutów tagu
Forum PHP.pl > Forum > Przedszkole
hobibit
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?
Damonsson
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.
hobibit
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.
IProSoft
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>' )
hobibit
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>) ([^>]+) )+ >
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.