2011-05-03 15 views
7

Potrzebuję usunąć znaczniki zakotwiczenia z jakiegoś tekstu i nie można tego zrobić za pomocą wyrażeń regularnych.
Tylko znaczniki zakotwiczenia, a nie ich treść.
Na przykład <a href="http://www.google.com/" target="_blank">google</a> stanie się google.Usuń kotwicę z tekstu

Odpowiedz

12

Dokładnie, to nie może być właściwie wykonywane za pomocą wyrażenia regularnego.

Oto przykład przy użyciu DOM:

$xml = new DOMDocument(); 
$xml->loadHTML($html); 

$links = $xml->getElementsByTagName('a'); 

//Loop through each <a> tags and replace them by their text content  
for ($i = $links->length - 1; $i >= 0; $i--) { 
    $linkNode = $links->item($i); 
    $lnkText = $linkNode->textContent; 
    $newTxtNode = $xml->createTextNode($lnkText); 
    $linkNode->parentNode->replaceChild($newTxtNode, $linkNode); 
} 

Ważne pętli wstecz, kiedy zmiany zostaną wprowadzone do DOM.

+0

fajna odpowiedź, ale w jaki sposób go używać? .. nie bardzo jasne na temat użycia. czy po prostu echo $ newTxtNode? lub lnkText ??? – jcobhams

+0

@VyrenMedia Op zapytał, jak zastąpić linki przez ich zawartość tekstową, więc na końcu tej pętli masz obiekt "DOMDocument" bez linków. Możesz użyć '$ xml-> saveHTML();', aby uzyskać cały wynik HTML. $ lnkText zawiera bieżący tekst linku jako ciąg, a możesz chcieć [przyciąć] (http://php.net/trim) go. –

+0

wielkie dzięki za odpowiedź @ Yann-Milin Znalazłem jednak rozwiązanie do wyrejestrowania dla tego problemu. – jcobhams

7

Szukasz strip_tags().

<?php 

// outputs 'google' 
echo strip_tags('<a href="http://www.google.com/" target="_blank">google</a>'); 
+1

Potrzebuję zachować inne znaczniki, tylko ja trzeba usunąć kotwice. – Lior

+0

@Lior ah, Rozumiem. 'strip_tags' faktycznie tego nie robi. W notatkach przesłanych przez użytkowników znajduje się implementacja, która może pomóc: http://php.net/manual/en/function.strip-tags.php # 100054 –

+0

@Pekka Możesz przekazać drugi argument do 'strip_tags()', który jest ciągiem "allowable_tags": http://php.net/manual/en/function.strip-tags.php. – Jasper

3

użyciu regex:

preg_replace('/<a[^>]+>([^<]+)<\/a>/i','\1',$html);

+1

Co jeśli w elementach kotwicy znajduje się element ''? – ridgerunner

10

Następnie można spróbować

preg_replace('/<\/?a[^>]*>/','',$Source); 

Próbowałem go online here on rubular

+1

To nie jest poprawne, ponieważ spowoduje również usunięcie innych znaczników zaczynających się od podobnego artykułu lub adresu. – LarS

+0

może lepsze regex: preg_replace ('/ <\ s * \ /? \ S * a (?: \ S * | \ s + [^>] *)> /', '', $ vars ['panele']); – LarS

+0

@ CSᵠ odpowiedź jest lepsza dla usunięcia nawet środkowego tekstu "a" tagi – Sadee

0

spróbować z:

$str = '<p>paragraph</p><a href="http://www.google.com/" target="_blank" title="<>">google -> foo</a><div>In the div</div>'; 
// first, extract anchor tag 
preg_match("~<a .*?</a>~", $str, $match); 
// then strip the HTML tags 
echo strip_tags($match[0]),"\n"; 

wyjściowa:

google -> foo 
4

Na to pytanie już udzielono odpowiedzi, ale pomyślałem, że dodam moje rozwiązanie do miksu. Podoba mi się to lepiej niż przyjęte rozwiązanie, ponieważ jest trochę bardziej do rzeczy.

+1

To jest ładne i proste, można również użyć '$ content = preg_replace (array ('' "', '"" '), array (' ',' '), $ content); w przypadku "href" nie jest pierwszym atrybutem w anchorze etykietka. –

+0

@DavidThomas świetny dodatek! – user1491929

0

Większość tutejszego regexu nie pomogła mi. Niektóre z nich usuwają zawartość wewnątrz zakotwiczenia (co wcale nie jest wymagane przez OP), a nie cała treść, część z nich będzie pasować do każdego tagu zaczynającego się od a, itp.

To jest to, co ja stworzony dla moich potrzeb w pracy. Mieliśmy problem z przekazywaniem HTML do wkhtmltopdf, który miał znaczniki zakotwiczenia (z wieloma atrybutami danych i innymi atrybutami) czasami uniemożliwiałoby tworzenie pliku PDF, dlatego chciałem je usunąć, zachowując tekst.

Regex:

/</a ([^>] *)>/ig

W PHP można zrobić:?

$text = "<a href='http://www.google.com/'>Google1</a><br>" . 
     "<a>Google2</a><br>" . 
     "<afaketag href='http://www.google.com'>Google2</afaketag><br>" . 
     "<afaketag>Google4</afaketag><br>" . 
     "<a href='http://www.google.com'><img src='someimage.jpg'></a>"; 
echo preg_replace("/<\/?a([^>]*)?>/i", "", $text); 

Wyjścia:

Google1<br>Google2<br><afaketag href='http://www.google.com'>Google2</afaketag><br><afaketag>Google4</afaketag><br><img src='someimage.jpg'>