помогите с preg_replace - PullRequest
       10

помогите с preg_replace

0 голосов
/ 13 июля 2009

я хочу заменить HTML-текст, закрытый тегом

start_ticker код.... end_ticker

У меня нет успеха

мой код

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

Ответы [ 4 ]

2 голосов
/ 13 июля 2009

Вы можете решить эту проблему, даже не используя регулярные выражения:

$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));
    }
}
1 голос
/ 13 июля 2009

Полагаю, вы хотите сохранить начальный / конечный теги. Затем вам нужно захватить их скобками:

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

Остерегайтесь, однако, регулярные выражения не лучший выбор, когда дело доходит до HTML.

1 голос
/ 13 июля 2009

Вам нужно:

$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#Greedy

В противном случае вы бы сопоставляли от первого до последнего удары, если между ними есть несколько совпадений.

1 голос
/ 13 июля 2009

По умолчанию "." не соответствует переводу строки - вы можете добавить модификатор "s" (DOTALL), чтобы изменить это. Я подозреваю, что это твоя проблема.

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