提取标签之间的文本,但不包括标签的正则表达式

4

我想编写一个正则表达式来提取字符串中两个标签<title>之间的内容,但不包括这两个标签。 例如,我有以下内容:

<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个回答

12
您可以使用以下正则表达式:
>([^<]*)<

或者, >[^<]*<

然后消除不需要的字符,如'<'和'>'。


2
你能解释一下 [^<] 的意思吗? - Amit Choukroun
2
这无法处理嵌套标签内的文本,例如<charlie><bob>Alice</bob></charlie>。有什么想法吗? - PeterX
@AmitChoukroun [] 表示字符或字符组列表,[] 中的 ^ 特别 表示非,* 表示0个或更多个字符,所以在口语中可以理解为:"0-N个字符,除了"<"之外的任意字符。 - undefined
@PeterX 看起来对我来说是有效的,但也许你可以尝试一下修改:preg_match_all('/>([^<]+)</', "<charlie><bob>Alice</bob></charlie>", $matches);$matches[1] 将包含纯粹的非空文本匹配项。 - undefined

7
最好的方法是使用断言,对于您的情况,正则表达式应该是:
(?<=\<title\>).*?(?=\<\/title\>)

for more details have a look here


如果内容中存在换行符,则此方法无法正常工作! - ZOXEXIVO

5
我使用这个正则表达式作为替换函数: (<.+?>)。

聪明的回答!我喜欢你看待事物的方式。 - Eric Novins

4

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

由于您在标签中提到了preg_match,我假设您想要这个功能用于PHP。

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

请注意,这实际上是我的模式中的第一个反向引用,因为我省略了标记本身周围的括号,这些括号是不必要的。
通常情况下,您不应使用正则表达式来解析HTML文档,但我认为这可能是一种例外情况,因为标题标记在页面上只应存在一次。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接