2009-09-01 52 views
17

尽管多年来一直使用PHP,但我从来没有真正学会如何使用表达式来正确截断字符串......现在它在背后咬我!如何删除标签之间的文字在PHP?

任何人都可以提供一些帮助截断这个吗?我需要砍掉从URL文本部分,把

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

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

回答

29
$str = preg_replace('#(<a.*?>).*?(</a>)#', '$1$2', $str) 
+0

虽然这可行,但您通常不想用正则表达式解析HTML。卡里姆的回答可能更可取。 – Konerak 2011-05-03 16:33:03

6

什么这样的事情,考虑到你可能要与其他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) 


作为sidenote:对于更复杂的HTML,不要尝试使用正则表达式:它们适用于这种简单的情况,但对于现实生活中的HTML部分,它们并不真正帮助l:HTML不够“常规”“足够”被正则表达式解析。

1

你可以结合使用子与stringpos沉绵这不是 一个非常好的方法。

检查:PHP Manual - String functions

另一种方式是写一个正则表达式匹配您的条件。 但为了让你的问题很快得到解决,字符串函数将会做...

编辑:我低估了观众。 ;)来吧用正则表达式... ^^

14

使用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; 
?> 
+2

没有冒犯,但这个答案是8岁,没有人实际上已经注意到这个答案是不正确的,不起作用。简单地回显'$ html'时,foreach循环没有效果。不能相信这会得到如此之多的选票,而且没有人真正测试过它。 – 2017-08-16 17:27:11

1

仅使用strip_tags(),这将摆脱标签和它们之间只留下所需的文本

0

你不需要自己捕获标签。只需定位标签之间的文本并将其替换为空字符串即可。超级简单。

代码:(Demo

$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和“向前”。