正则表达式,用于在标签之间提取文本,但不提取标签

时间:2013-02-22 21:59:22

标签: php regex preg-match preg-match-all

我想编写一个正则表达式,它提取字符串中两个标记<title>之间的内容,但不提取标记。 IE我有以下

<title>My work</title>
<p>This is my work.</p> <p>Learning regex.</p>

正则表达式

(<title>)(.*?)(<\/title>)

提取<title>My work</title>,但我只想提取My work。我怎样才能做到这一点? 这是示例http://regex101.com/r/mD8fB0

的链接

4 个答案:

答案 0 :(得分:8)

您可以使用以下正则表达式:

>([^<]*)<

或,&gt; [^&lt;] *&lt;

然后消除不需要的字符,例如'&lt;' &安培; '&GT;'

答案 1 :(得分:5)

最好的方法是使用断言,对于你的情况,正则表达式将是:

(?<=\<title\>).*?(?=\<\/title\>)

有关详细信息,请查看here

答案 2 :(得分:3)

在你的情况下,你可以使用正则表达式中的第二个反向引用,它会保存你感兴趣的文本。

由于您在代码中提到preg_match,我假设您希望将其用于PHP。

$matches = array();
$pattern = '#<title>(.*?)</title>#'; // note I changed the pattern a bit
preg_match($pattern, $string, $matches);
$title = $matches[1];

请注意,这实际上是我模式中的第一个后向引用,因为我已经省略了标记本身周围的括号,这些不需要。

通常情况下,您不应该使用Regex来解析HTML文档,但我认为这可能是其中一种例外情况,因为标题标记只应存在于页面上一次。

答案 3 :(得分:2)

我用它作为Regex的替换函数:(&lt;。+?&gt;)