2009-07-13 112 views
0

我要替换HTML文本关闭按标签帮助的了preg_replace

start_ticker 代码.... end_ticker

我没有成功

我的代码是

$string_html = preg_replace('/<!-- start_ticker -->.*<!-- end_ticker -->/i',"bla bla",$string_html); 

回答

1

默认情况下“。”与换行符不匹配 - 您可以添加“s”(DOTALL)修改器来改变它。 我怀疑这是你的问题。

$string_html = preg_replace('/<!-- start_ticker -->.*<!-- end_ticker -->/is',"bla bla",$string_html); 
+0

/在代替我的每一件事情,我也得到空字符串 – 2009-07-13 07:57:20

+0

我做了一个错字第一次 - 应该是/是 – Greg 2009-07-13 08:07:01

+0

如果你不't想要替换评论,然后结合这与@ soulmerge的答案 – Greg 2009-07-13 08:08:00

1

我想你想保留开始/结束标签。然后你需要用括号来捕获它们:

$string_html = preg_replace('/(<!-- start_ticker -->).*(<!-- end_ticker -->)/i', '$1bla bla$2', $string_html); 

请注意,虽然正则表达式并不是HTML的最佳选择。

1

您需要:

$match1 = '<!-- start_ticker -->'; 
$match2 = '<!-- end_ticker -->'; 
$replace = 'bla bla'; 
$string = preg_replace("/$match1(.*?)$match2/is", $match1.$replace.$match2, $string); 

注意,使一个大的差异,因为它使比赛ungreedy(*?)。这是当模式将与该模式的最大可能排列数相匹配时,而不是最少。

http://www.troubleshooters.com/codecorn/littperl/perlreg.htm#Greedy

否则,你会在如果有多个匹配之间匹配从第一个到最后重挫什么。

2

可以解决这个问题,即使没有使用正则表达式:

$start = '<!-- start_ticker -->'; 
$end = '<!-- end_ticker -->'; 
$replacement = 'blabla'; 
$posStart = stripos($str, $start); 
if ($posStart !== false) { 
    $posEnd = stripos($str, $end, $posStart); 
    if ($posEnd !== false) { 
     $str = substr($str, 0, $posStart) . $replacement . substr($str, $posEnd + strlen($end)); 
    } 
}