سؤال

أحتاج إلى إضافة بعض العلامات قبل وبعد الصور على المستند وحدها مرة واحدة. رمز مستند HTML هو:

....

<img src="http://img.example.com/img/mage1.jpg" alt="sometile"> <br> 
<img src="http://img.example.com/img/image72.jpg" alt="sometile"> <br> 
<img src="http://img.example.com/img/imagstr.jpg" alt="sometile"> <br> 
<img src="http://img.example.com/img/image.jpg" alt="sometile"> <br> 
<img src="http://img.example.com/img/imgger.gif" alt="sometile"> <br> 
<img src="http://img.example.com/img/somepic.png" alt="sometile"> <br> 

أحتاج في رمز النتيجة مثل هذا

<div><a name="#pic1"></a><img src="http://img.example.com/img/mage1.jpg" alt="sometile"></div>
<div><a name="#pic2"></a><img src="http://img.example.com/img/image72.jpg" alt="sometile"> </div> 
<div><a name="#pic3"></a><img src="http://img.example.com/img/imagstr.jpg" alt="sometile"> </div> 
<div><a name="#pic4"></a><img src="http://img.example.com/img/image.jpg" alt="sometile"> </div> 
<div><a name="#pic5"></a><img src="http://img.example.com/img/imgger.gif" alt="sometile"> </div> 
<div><a name="#pic6"></a><img src="http://img.example.com/img/somepic.png" alt="sometile"> </div> 
هل كانت مفيدة؟

المحلول

أنا لست من محبي Regex+HTML ، ولكن هنا يذهب (لقد قمت فقط بطهي regex بسيط - ربما لديك بالفعل واحدة):

$s = '<img src="http://img.example.com/img/mage1.jpg" alt="sometile"> <br> 
<img src="http://img.example.com/img/image72.jpg" alt="sometile"> <br> 
<img src="http://img.example.com/img/imagstr.jpg" alt="sometile"> <br> 
<img src="http://img.example.com/img/image.jpg" alt="sometile"> <br> 
<img src="http://img.example.com/img/imgger.gif" alt="sometile"> <br> 
<img src="http://img.example.com/img/somepic.png" alt="sometile"> <br>';

$i = 0;
function wrap($s) {
        global $i;
        $i++;
        return sprintf('<div><a name="pic%d">%s</div>', $i, $s);
}

print preg_replace('#(<img [^>]+?>) <br>#e', "wrap('\\1')", $s);

(العرض التوضيحي)

الجزء المهم هو e المعدل في preg_replace(). نرى "مثال رقم 4 باستخدام المعدل "E"."


تعديل
كما أشار في التعليقات ، $i بالتأكيد ليس أفضل اسم لمتغير عالمي. إذا كان سيتم استخدام هذا كتحول بسيط "لمرة واحدة" ، فقد يكون على ما يرام. إذا لم يكن الأمر كذلك ، قم بتغيير الاسم إلى شيء سوف ليس نزاع. أو ضعها على أنها أ public static في الفصل.

ايضا، preg_replace_callback() موجود. إنه أكثر ملاءمة ، على الرغم من أنني أجد اسم الوظيفة كسلسلة وتقييم functionName('arg') تقريبا قبيح على قدم المساواة :)

نصائح أخرى

كما عادة ، يمكنك أيضًا القيام بذلك دوم:

$counter = 0;
$doc = new DOMDocument();
$doc->loadHTML($str);
foreach ($doc->getElementsByTagName("img") as $img) {
    $sibling = $img->nextSibling;
    while ($sibling) {
        if ($sibling instanceof DOMElement && $sibling->tagName === 'br') {
            $sibling->parentNode->removeChild($sibling);
        }
        $sibling = $sibling->nextSibling;
    }
    $div = $doc->createElement("div");
    $img->parentNode->replaceChild($div, $img);
    $a = $doc->createElement("a");
    $a->setAttribute("name", "pic" . (++$counter));
    $a->appendChild($img);
    $div->appendChild($a);
}
$str = '';
foreach (simplexml_import_dom($doc->getElementsByTagName("body")->item(0))->children() as $elem) {
    $str .= $elem->asXML();
}

بادئ ذي بدء ، ليس من المفترض أن تستخدم regexes للتعامل مع HTML.

ومع ذلك ، في هذه الحالة ، يكون الأمر سهلاً لأنك تتعامل تقريبًا مع الخطوط الكاملة:

$code = '<img src="http://img.example.com/img/mage1.jpg" alt="sometile"> <br>
<img src="http://img.example.com/img/image72.jpg" alt="sometile"> <br>
<img src="http://img.example.com/img/imagstr.jpg" alt="sometile"> <br>
<img src="http://img.example.com/img/image.jpg" alt="sometile"> <br>
<img src="http://img.example.com/img/imgger.gif" alt="sometile"> <br>
<img src="http://img.example.com/img/somepic.png" alt="sometile"> <br>';

function get_num_row($matches) {
    global $last_num;
    return '<div><a name="pic' . (++$last_num) . '">' . trim($matches[1]) . '</a></div>';
}

$last_num = 0;
$code = preg_replace_callback('/^(.*)<br>$/m', 'get_num_row', $code);
echo $code;

انتاج:

<div><a name="pic1"><img src="http://img.example.com/img/mage1.jpg" alt="sometile"></a></div>
<div><a name="pic2"><img src="http://img.example.com/img/image72.jpg" alt="sometile"></a></div>
<div><a name="pic3"><img src="http://img.example.com/img/imagstr.jpg" alt="sometile"></a></div>
<div><a name="pic4"><img src="http://img.example.com/img/image.jpg" alt="sometile"></a></div>
<div><a name="pic5"><img src="http://img.example.com/img/imgger.gif" alt="sometile"></a></div>
<div><a name="pic6"><img src="http://img.example.com/img/somepic.png" alt="sometile"></a></div>

بالطبع تحتاج إلى ضبط $last_num إلى 0 إذا كنت ستستخدم رد الاتصال مرة أخرى. لا توجد وسيلة للقيام بذلك بدون VAR عالمي أو ثابت. ولكن إذا كنت ستستخدم رد الاتصال مرة أخرى ، يمكنك ببساطة التغيير global $last_num; إلى static $last_num = 0;. بعد ذلك ، سوف يزداد إلى الأبد دون أي فرصة لإعادة تعيينه - لكنه لن يلفت مساحة اسمك العالمية.

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