删除<hr />和<embed />标记之间的所有文本?

时间:2010-08-02 20:02:34

标签: php preg-replace

<hr>I want to remove this text.<embed src="stuffinhere.html"/>

我尝试使用正则表达式,但没有任何作用。

提前致谢。

P.S。我试过这个:$str = preg_replace('#(<hr>).*?(<embed)#', '$1$2', $str)

3 个答案:

答案 0 :(得分:3)

对于使用HTML解析器进行此类操作,您会收到很多建议。你应该这样做。

这个答案的其余部分是因为你已经确定HTML解析器太慢,不能处理生成错误(即野外标准)HTML,或者是难以集成到系统中你无法控制。我创建了以下小shell脚本

$str = '<hr>I want to remove this text.<embed src="stuffinhere.html"/>';
$str = preg_replace('#(<hr>).*?(<embed)#', '$1$2', $str);
var_dump($str);

//outputs
string(35) "<hr><embed src="stuffinhere.html"/>"

删除了文本,因此我会检查您的RegEx周围的源文档和任何其他PHP代码。你没有给preg_replace喂你认为你的字符串。我最好的猜测是你的源文件有不规则的情况,或者&lt; hr /&gt;之间有空格。和&lt; embed&gt;。请改为使用以下正则表达式。

$str = '<hr>I want to remove 
this text.
<EMBED src="stuffinhere.html"/>';
$str = preg_replace('#(<hr>).*?(<embed)#si', '$1$2', $str);
var_dump($str);

//outputs
string(35) "<hr><EMBED src="stuffinhere.html"/>"

“i”修饰符表示“使此搜索大小写不敏感”。 “s”修饰符表示“[。]字符也应符合我平台的换行符/回车顺序” 但如果可以,请使用正确的解析器。严重。

答案 1 :(得分:0)

$text = '<hr>I want to remove this text.<embed src="stuffinhere.html"/>';
$text = preg_replace('#(<hr>).*?(<embed.*?>)#', '$1$2', $text);

echo $text;

如果您想在嵌入代码中硬编码src:

$text = '<hr>I want to remove this text.<embed src="stuffinhere.html"/>';
$text = preg_replace('#(<hr>).*?(<embed src="stuffinhere.html"/>)#', '$1$2', $text);

echo $text;

答案 2 :(得分:0)

我认为代码是不言自明的,很容易理解,因为它不使用正则表达式(而且可能更快)...


$start='<hr>';
$end='<embed src="stuff...';
$str=' html here... ';

function between($t1,$t2,$page) {
 $p1=stripos($page,$t1);
 if($p1!==false) {
  $p2=stripos($page,$t2,$p1+strlen($t1));
 } else {
  return false;
 }
 return substr($page,$p1+strlen($t1),$p2-$p1-strlen($t1));
}

$found=between($start,$end,$str);
while($found!==false) {
  $str=str_replace($start.$found.$end,$start.$end,$str);
  $found=between($start,$end,$str);
}

// do something with $str here...