我有一个带有WYSIWYG编辑器的CMS,可以生成相当不错的xhtml。基于这个事实,我认为HTML解析器对于这个小工作可能有点过分。
我打算使用正则表达式,但到目前为止一直无法让我匹配我所追求的。
我正在使用PHP5。
我需要匹配WYSIWYG编辑器能够产生的3个块级元素的内容:p,ul&醇。我目前正在使用preg_match_all()。
有人能帮助我吗?
谢谢
答案 0 :(得分:2)
只要你没有嵌套的p / ul / ol标签,这就应该有效:
preg_match_all("<(?:p|ul|ol)>(.*?)</(?:p|ul|ol)>", $string, $matches)
?:
会阻止parens中的任何内容包含在$matches
中,而.*?
会阻止正则表达式匹配超过另一个标记的结尾。
答案 1 :(得分:0)
我想我只想出来了
preg_match_all('/<(p|ul|ol)>(.*)<\/(p|ul|ol)>/iU', $content, $blockElements);
答案 2 :(得分:0)
只要您不在p标签中嵌入p标签或在ul中嵌套ul,这将找到每个标签的最顶部。但是你可以将p嵌套在ul中。对于复杂的html,您最好使用DOM。
示例数据:
$html = <<< EOF
<p>
hey
</p>
<ul>
<li>
test
</li>
<li>
<p>
df4r4 4f4
</p>
</li>
</ul>
<p>
hoo
</p>
EOF;
正则表达式:
$regex = '#<(?P<tags>(?i)p|ul|ol)>(?P<values>.*?)</\1>#si';
preg_match_all($regex, $html, $output);
按标签排序:
for ($i = 0, $t = count($output['tags']); $i < $t; $i++) {
$out[$output['tags'][$i]][] = $output['values'][$i];
}
分别使用标记和值,使用整数键删除重复项,整行匹配:
$output = array_intersect_key($output, array('tags' => 0, 'values' => 0));