Как удалить текст между тегами в PHP?

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

кто-нибудь может оказать мне помощь усек это? Мне нужно вырезать текстовую часть из url-адреса, повернув

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

на

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

6 ответов


$str = preg_replace('#(<a.*?>).*?(</a>)#', '', $str)

С помощью 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;
?>

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

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

что вы получите :

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

(Я считаю, что вы сделали опечатку в ОП ? )


Если вам не нужно соответствовать любому другому href, вы можете использовать что-то вроде :

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

, который также поможет вам :

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


Как sidenote : для более сложного HTML не пытайтесь использовать регулярные выражения: они отлично работают для такой простой ситуации, но для реальной HTML-части они действительно не помогают, в общем : HTML не совсем "регулярен", "достаточно", чтобы быть проанализированным regexes.


использовать только strip_tags(), Что бы избавиться от тегов и оставили только нужный текст между ними


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

проверка: PHP Manual-строковые функции

другим способом было бы написать регулярное выражение, соответствующее вашим критериям. Но для того, чтобы ваша проблема была решена быстро, будут использоваться строковые функции...

EDIT: я недооценил аудиторию. ;) Продолжайте с regexes... ^^


вам не нужно захватывать сами теги. Просто выделите текст между тегами и замените его пустой строкой. Очень просто.

код: (демо)

$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

выход:

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

или в крайних случаях, когда текст ссылки содержит < используйте этот: ~<a[^>]*>\K.*?(?=</a>)~

это позволяет избежать расходов групп захвата с помощью ленивого квантора, перезапуск fullstring \K и "lookahead".