Как убрать текст между тегами в php? - PullRequest
18 голосов
/ 01 сентября 2009

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

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

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

в

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

Ответы [ 6 ]

31 голосов
/ 01 сентября 2009
$str = preg_replace('#(<a.*?>).*?(</a>)#', '$1$2', $str)
13 голосов
/ 01 сентября 2009

Использование 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;
?>
7 голосов
/ 01 сентября 2009

Как насчет этого, учитывая, что вы, возможно, захотите повторно использовать его с другими 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)

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


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

$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 не вполне "регулярно" "достаточно" для анализа регулярными выражениями.

1 голос
/ 02 мая 2011

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

1 голос
/ 01 сентября 2009

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

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

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

РЕДАКТИРОВАТЬ: я недооценил аудиторию. ;) Вперед с регулярными выражениями ... ^^

0 голосов
/ 16 декабря 2017

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

Код: ( Демо )

$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>)~

Это позволяет избежать затрат на группы захвата с использованием ленивого квантификатора, перезапуска полной строки \K и «lookahead».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...