帮助 preg_replace

发布于 2024-07-26 15:31:42 字数 238 浏览 8 评论 0原文

我想替换由标签

start_ticker 结束的 html 文本 代码.... end_ticker

我没有成功

我的代码是

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

i want to replace html text that closed by tag

start_ticker
code....
end_ticker

i don't success

my code is

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

水波映月 2024-08-02 15:31:43

即使不使用正则表达式也可以解决该问题:

$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));
    }
}

You can solve that problem even without using regular expressions:

$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));
    }
}
蹲墙角沉默 2024-08-02 15:31:43

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

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

By default "." doesn't match newlines - you can add the "s" (DOTALL) modifier to change this.
I suspect that's your problem.

$string_html = preg_replace('/<!-- start_ticker -->.*<!-- end_ticker -->/is',"bla bla",$string_html);
空心↖ 2024-08-02 15:31:43

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

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

但要注意,正则表达式对于 html 来说并不是最佳选择。

I guess you want to keep the start/end tags. Then you need to capture them with brackets:

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

Beware though, that regular expressions are not the best choice when it comes to html.

千年*琉璃梦 2024-08-02 15:31:43

您需要:

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

请注意 (.*?) 会产生很大的差异,因为它使匹配变得不贪婪。 此时模式将与该模式的最大数量的可能排列相匹配,而不是最少的排列。

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

否则,如果有多个匹配项,您将从第一个匹配到最后一个,从而破坏中间的任何内容。

You need:

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

Note that (.*?) makes a large difference since it makes the match ungreedy. This is when the pattern will be matched to the largest number of possible permutations of that pattern, rather then the least.

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

Otherwise, you would match from the first to the last clobbering anything in between if there are multiple matches.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文