Ответ 1
$str = preg_replace('#(<a.*?>).*?(</a>)#', '$1$2', $str)
Несмотря на использование 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;
?>
Что-то вроде этого, учитывая, что вы захотите повторно использовать его с другим 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 не довольно "регулярное" "достаточно" для анализа синтаксически регулярными выражениями.
Вы можете использовать подстроку в сочетании со строками, хотя это не так очень хороший подход.
Отметьте: Руководство PHP - Строковые функции
Другим способом было бы написать регулярное выражение, соответствующее вашим критериям. Но чтобы быстро решить вашу проблему, строковые функции будут...
EDIT: Я недооценил аудиторию.;) Продолжайте регулярные выражения... ^^
Используйте только strip_tags()
, который избавится от тегов и оставит только желаемый текст между ними
Вам не нужно записывать сами теги. Просто настройте текст между тегами и замените его пустой строкой. Супер простой.
Код: (Демо)
$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".