Несмотря на использование 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».