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

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

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

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

в

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

 $str = preg_replace('#(<a.*?>).*?(</a>)#', '$1$2', $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; ?> в <?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; ?> 

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

 $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 не довольно «регулярный» «достаточно», чтобы анализировать регулярные выражения.

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

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

Проверить: PHP Manual – Строковые функции

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

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

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

Код: ( Демо )

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