【问题标题】:preg_match - text between closing and opening tagpreg_match - 结束标签和开始标签之间的文本
【发布时间】:2018-08-11 11:17:53
【问题描述】:

我有很奇怪的任务要做。

我需要使用 PHP 中的 preg_match() 函数从 html 标签中获取文本。问题是我需要的文本介于关闭和打开 html 标记或带有标记的文本之间。

下面是我的html字符串:

<h2>Title of post</h2> 1 category <strong>task 1</strong> 1 category <strong>task 2</strong> 1 category <strong>task 3</strong>&nbsp; 

更具体地说:我需要在&lt;/h2&gt;&lt;strong&gt; 标记之间使用字符串“1 个类别”。

当我尝试在开始标签和结束标签之间抓取文本时 - 它工作正常,我正在使用这个功能:

preg_match_all('#<strong>(.*?)</strong>#',$string,$matches);

我尝试了许多组合来获取结束标签和开始标签之间的文本。他们都没有成功。我已经结束了使用这样的功能:

preg_match_all('#<\/strong>(.*?)<strong>#',$content,$matches_all);

没有结果。

奇怪的是,在在线正则表达式测试器上,这个具有上述模式的函数有时会起作用。

我有不好的模式吗?我错过了一些标志吗?您知道以这种方式获取文本的最佳方法是什么吗?不幸的是,我必须使用 Regex 方法,在我的情况下不允许使用 XMLDomParser 之类的解决方案。

非常感谢您的帮助。

【问题讨论】:

  • 为什么你说它对你不起作用?输入?输出?预期输出?
  • 您可以在ideone.com 或类似处准备一些代码
  • 您可以通过您的第一个工作正则表达式将字符串拆分为一个数组。结果数组将有" 1 category "。类似$arr = preg_split("/&lt;(strong|h2)&gt;.*?&lt;/(\1)&gt;/", $input);
  • 您可以尝试以下链接:regex101ideone。两者都有一个工作示例。
  • @fabtosz 请解释为什么不允许您使用适当的工具来完成此任务。 3v4l.org/5BIG4

标签: php html regex parsing preg-match


【解决方案1】:

您的 php 安装/配置似乎有问题。

您的代码。

$content = '<h2>Title of post</h2> 1 category <strong>task 1</strong> 1 category <strong>task 2</strong> 1 category <strong>task 3</strong>&nbsp;'; 
preg_match_all('#<\/h2>(.*?)<strong>#',$content,$matches);
print_r($matches);

输出:

Array
(
    [0] => Array
        (
            [0] => </h2> 1 category <strong>
        )

    [1] => Array
        (
            [0] =>  1 category 
        )

)

直播demo

注意:由于您的模式只有一个匹配项(在&lt;/h2&gt;&lt;strong&gt; 之间),您可以像$maches[1][0] 一样访问或使用preg_match

【讨论】:

    【解决方案2】:

    试试这个。

    preg_match_all('/<([^>]+)>(?:([^<]+))*(?=[^>]*\<)/',$string,$matches);
    

    Live Demo

    【讨论】:

    • 试试这个答案对教育 OP 和未来的研究人员几乎没有作用。请始终,始终在您发布的每个旨在教育的答案中包含某种解释。
    【解决方案3】:

    如果您希望在结束标记和开始标记之间有 所有 段文本,则可以使用此代码。请注意,我更改了您的文本,以便每组结束/开始标签之间的文本不同,以便更明显地匹配找到每个值。

    $str = '<h2>Title of post</h2> 1 category <strong>task 1</strong> 2 category <strong>task 2</strong> 3 category <strong>task 3</strong> ';
    preg_match_all('#(?:</[^>]+>)(.*?)<#', $str, $matches);
    print_r($matches[1]);
    

    输出:

    Array
    (
        [0] =>  1 category 
        [1] =>  2 category 
        [2] =>  3 category 
    )
    

    【讨论】:

      猜你喜欢
      • 2011-06-07
      • 2016-05-24
      • 2016-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多