php正则表达式问题

时间:2011-10-09 21:38:47

标签: php regex

是的,我知道在html上使用正则表达式不是首选,但我仍然感到困惑,为什么这不起作用:

我正试图从文件中删除“头” 这是doc:

<html>
 <head>
   <!--
     a comment within the head
     -->
 </head>
 <body>
stuff in the body
 </body>
</html>

我的代码:

$matches = array(); $result = preg_match ('/(?:<head[^>]*>)(.*?)(<\/head>)/is', $contents, $matches); 
var_dump ($matches);

这实际上不起作用。 这是我看到的输出:

array(3) { [0]=> string(60) " " [1]=> string(47) " " [2]=> string(7) "" }

但是,如果我调整HTMl doc没有评论

我缺少什么?

谢谢!

3 个答案:

答案 0 :(得分:4)

您的正则表达式看起来很好,但提取 <head>;你想删除头部。请尝试使用preg_replace代替:

$without_head = preg_replace ('/(?:<head[^>]*>)(.*?)(<\/head>)/is', '', $contents);

答案 1 :(得分:1)

php > $str=<<<EOS
<<< > <head>
<<< >    <!--
<<< >      a comment within the head
<<< >      -->
<<< >  </head>
<<< > EOS;
php > $r=preg_match('/(?:<head[^>]*>)(.*?)(<\/head>)/is',$str,$matches);
php > var_dump($r);
int(1)
php > var_dump($matches);
array(3) {
  [0]=>
  string(63) "<head>
   <!--
     a comment within the head
     -->
 </head>"
  [1]=>
  string(50) "
   <!--
     a comment within the head
     -->
 "
  [2]=>
  string(7) "</head>"
}

你的意思是使用preg_replace吗?

php > $r=preg_replace('/(?:<head[^>]*>)(.*?)(<\/head>)/is','',$str);
php > var_dump($r);
string(0) ""

答案 2 :(得分:1)

您的脚本工作正常,由于转储中的HTML而无法正确显示(您可以通过var_dump输出中的长度来判断)。尝试:

$result = preg_match ('/(?:<head[^>]*>)(.*?)(<\/head>)/is', $contents, $matches); 
ob_start(); // Capture the result of var_dump
var_dump ($matches);
echo htmlentities(ob_get_clean()); // Escape HTML in the dump

此外,如上所述,您需要使用preg_replace将匹配替换为'',以便实际删除头部。