Как удалить текст между тегами в PHP?
несмотря на использование PHP в течение многих лет, я никогда не учился правильно использовать выражения для усечения строк... который теперь кусает меня в зад!
кто-нибудь может оказать мне помощь усек это? Мне нужно вырезать текстовую часть из url-адреса, повернув
<a href="link.html">text</a>
на
<a href="link.html"></a>
6 ответов
С помощью 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;
?>
как насчет чего-то подобного, учитывая, что вы можете захотеть повторно использовать его с другими href
s:
$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".