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

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

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

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

в

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

Ответы

Ответ 1

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

Ответ 2

Использование 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;
?>

Ответ 3

Что-то вроде этого, учитывая, что вы захотите повторно использовать его с другим href:

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

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

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

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


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

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

Которая также получит вас:

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


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

Ответ 4

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

Отметьте: Руководство PHP - Строковые функции

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

EDIT: Я недооценил аудиторию.;) Продолжайте регулярные выражения... ^^

Ответ 5

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

Ответ 6

Вам не нужно записывать сами теги. Просто настройте текст между тегами и замените его пустой строкой. Супер простой.

Код: (Демо)

$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".