سؤال

أريد أن استبدال نص HTML الذي أغلق حسب العلامة

رمز start_ticker .... end_ticker

أنا لا نجاح

التعليمات البرمجية الخاصة بي

$string_html = preg_replace('/<!-- start_ticker -->.*<!-- end_ticker -->/i',"bla bla",$string_html);
هل كانت مفيدة؟

المحلول

بشكل افتراضي "." لا تتطابق مع Newlines - يمكنك إضافة تعديل "S" (Dotall) لتغيير هذا. أظن أن مشكلتك.

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

نصائح أخرى

يمكنك حل هذه المشكلة حتى دون استخدام تعبيرات منتظمة:

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

أعتقد أنك تريد الاحتفاظ بعلامات البداية / الإنهاء. ثم تحتاج إلى التقاطها مع الأقواس:

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

حذار، أن التعبيرات العادية ليست الخيار الأفضل عندما يتعلق الأمر بتنسيق HTML.

انت تحتاج:

$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.

خلاف ذلك، سوف تتطابق من أول إلى آخر تطعيم أي شيء بين ما إذا كان هناك مباريات متعددة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top