preg_match-结束标记和开始标记之间的文本

时间:2018-08-11 11:17:53

标签: php html regex parsing preg-match

我要做的任务很奇怪。

我需要使用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; 

更具体地说:我需要在</h2><strong>标签之间使用字符串“ 1 category”。

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

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

我尝试了多种组合以在结束标记和开始标记之间获取文本。他们都没有解决。我已经结束使用这样的功能了:

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

没有结果。

奇怪的是,在在线正则表达式测试器上,具有上述功能且具有上述功能的功能有时会起作用。

我的图案不好吗?我是否缺少一些标志?您知道以这种方式获取文字的最佳方法是什么吗?不幸的是,我与Regex方法有关,在我的情况下,不允许使用XMLDomParser之类的解决方案。

非常感谢您的帮助。

3 个答案:

答案 0 :(得分:0)

尝试这个。

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

Live Demo

答案 1 :(得分:0)

看起来像您的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

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

答案 2 :(得分:0)

如果您希望在结束标记和开始标记之间所有一段文本,则可以使用此代码。请注意,我更改了您的文本,以使每组关闭/打开标签之间的文本都不同,从而很明显匹配是在查找每个值。

$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 
)