我有以下输入
<div style="s1">title1</div>
<div style="s1">content1</div>
<div style="s1">title2</div>
<div style="s1">content2</div>
我知道title1
和title2
,我想收集content1和content2
我需要这样的东西:
<div style="s1">title1</div>.*?<div style="s1">(.*?)</div>
但由于regexp是贪婪的,它会匹配到最后,所以返回
content1</div>
<div style="s1">title2</div>
<div style="s1">content2
我想在模式中添加一个不应包含在匹配中的标记列表。
类似的东西:
<div style="s1">title1</div>.*?<div style="s1">(.*?[^<div])</div>
我将[^<div]
引用到不包含的内容。这应该是多个选项,可能使用|
我该怎么做?
答案 0 :(得分:4)
现在已经不在了,只需做一些dom操作和xpath:
$dom = new DOMDocument();
@$dom->loadHTML($html);
$x = new DOMXPath($dom);
foreach($x->query("//div") as $node)
{
if (trim($node->textContent) == 'title1')
{
$content['title1'] = $node->nextSibling->textContent;
}
}
现在不是那么容易吗?所以没有更多的regexing html kay?
答案 1 :(得分:0)
<div style="s1">title1</div>.*<div style="s1">(([^<]|<[^\/])*)</div>
试试这个 - 这意味着找到除了&lt;或者&lt;没有后跟/ - 如果你愿意,我可以为sub-div等添加条件。
答案 2 :(得分:0)
只需使用U选项= ungreedy: http://.php.net/manual/fr/reference.pcre.pattern.modifiers.php