【问题标题】:Regex that extracts text between tags, but not the tags提取标签之间文本但不提取标签的正则表达式
【发布时间】:2013-02-08 15:28:43
【问题描述】:

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

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

正则表达式

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

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

【问题讨论】:

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


    【解决方案1】:

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

    既然你在标签中提到了preg_match,我假设你想要这个用于 PHP。

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

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

    通常,您不应该使用正则表达式来解析 HTML 文档,但我认为这可能是其中一种例外情况,情况还不错,因为标题标签应该只在页面上存在一次。

    【讨论】:

      【解决方案2】:

      我用它作为 Regex 的替换函数:(<.>)

      【讨论】:

      • 聪明的答案!我喜欢你看待事物的方式
      【解决方案3】:

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

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

      更多详情请看here

      【讨论】:

      • 如果内容中存在换行符,这将不起作用!
      【解决方案4】:

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

      >([^<]*)<
      

      或者,>[^

      然后消除不需要的字符,例如 ''

      【讨论】:

      • 你能解释一下[^&lt;]的意思吗?
      • 这不适用于&lt;charlie&gt;&lt;bob&gt;Alice&lt;/bob&gt;&lt;/charlie&gt; - 即嵌套标签内的文本。有什么想法吗?