从字符串获取XHTML标记的内容:p,ul和/或ol

时间:2009-01-12 06:09:12

标签: php regex

我有一个带有WYSIWYG编辑器的CMS,可以生成相当不错的xhtml。基于这个事实,我认为HTML解析器对于这个小工作可能有点过分。

我打算使用正则表达式,但到目前为止一直无法让我匹配我所追求的。

我正在使用PHP5。

我需要匹配WYSIWYG编辑器能够产生的3个块级元素的内容:p,ul&醇。我目前正在使用preg_match_all()。

有人能帮助我吗?

谢谢

3 个答案:

答案 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));