2009-09-01 17 views
17

Pomimo używania PHP od lat, nigdy naprawdę nie nauczyłem się, jak używać wyrażeń, aby poprawnie skracać łańcuchy ... co teraz gryzie mnie w plecy!Jak usunąć tekst między znacznikami w php?

Czy ktoś może mi pomóc w obcinaniu tego? Muszę posiekać się fragment tekstu z adresu URL, obracając

<a href="link.html">text</a> 

do

<a href="link.html"></a> 

Odpowiedz

29
$str = preg_replace('#(<a.*?>).*?(</a>)#', '$1$2', $str) 
+0

Podczas gdy to działa, zazwyczaj nie chcesz parsować HTML za pomocą wyrażeń regularnych. Odpowiedź Karima może być lepsza. – Konerak

6

Co o czymś takim, zważywszy może chcesz ponownie go używać z innymi href s:

$str = '<a href="link.html">text</a>'; 
$result = preg_replace('#(<a[^>]*>).*?(</a>)#', '$1$2', $str); 
var_dump($result); 

Który będzie ci:

string '<a href="link.html"></a>' (length=24) 

(Rozważam, że popełniłeś literówkę w OP?)


Jeśli nie trzeba dopasować dowolny inny href, można użyć coś takiego:

$str = '<a href="link.html">text</a>'; 
$result = preg_replace('#(<a href="link.html">).*?(</a>)#', '$1$2', $str); 
var_dump($result); 

Które otrzymają również Ty:

string '<a href="link.html"></a>' (length=24) 


jako sidenote: w przypadku bardziej złożonego kodu HTML nie należy używać wyrażeń regularnych: działają one dobrze w tego rodzaju prostych sytuacjach, ale w przypadku rzeczywistej części HTML nie pomagają w l: HTML nie jest dość "regularny" "wystarczająco", aby można go było analizować za pomocą wyrażeń regularnych.

1

Można użyć podciąg w połączeniu z stringpos, mimo iż nie jest to bardzo miłe podejście.

Sprawdź: PHP Manual - String functions

Innym sposobem byłoby napisać wyrażenie regularne pasujące do Twoich kryteriów. Jednak aby szybko rozwiązać problem, funkcje ciągów znaków będą ...

EDYCJA: Nie doceniam odbiorców. ;) Idź naprzód z regexes ... ^^

14

Korzystanie SimpleHTMLDom:

<?php 
// example of how to modify anchor innerText 
include('simple_html_dom.php'); 

// get DOM from URL or file 
$html = file_get_html('http://www.example.com/'); 

//set innerText to null for each anchor 
foreach($html->find('a') as $e) { 
    $e->innerText = null; 
} 

// dump contents 
echo $html; 
?> 
+2

Bez urazy, ale ta odpowiedź ma 8 lat i nikt nie zauważył, że ta odpowiedź jest nieprawidłowa i nie działa. Pętla foreach nie działa, gdy po prostu echo '' html'. Nie mogę uwierzyć, że dostałem tak wiele głosów w górę i nikt go nie przetestował. –

1

używać tylko strip_tags(), że będzie pozbyć tagów i lewo tylko żądany tekst pomiędzy nimi

0

You nie trzeba przechwytywać samych znaczników. Po prostu zaznacz tekst między tagami i zastąp go pustym ciągiem. Super proste.

Kod: (Demo)

$string='<a href="link.html">text</a>'; 
echo preg_replace('/<a[^>]*>\K[^<]*/','',$string); 
// the opening tag--^^^^^^^^ ^^^^^-match everything before the end tag 
//       ^^-restart fullstring match 

wyjściowa:

<a href="link.html"></a> 

lub w przypadkach skrajnych, kiedy tekst linku zawiera <, użyj tego: ~<a[^>]*>\K.*?(?=</a>)~

Pozwala to uniknąć kosztów związanych z przechwytywanie grup za pomocą leniwego kwantyfikatora, pełne ponowne uruchamianie \K i "poprzedzenie".

Powiązane problemy