Help Hàm tìm kiếm và thay thế

Discussion in 'Hỏi Đáp Kỹ Thuật' started by longhcm, Jan 10, 2024.

  1. longhcm

    longhcm Sơ Nhập Giang Hồ

    Mấy hôm nay làm Hàm (PHP) tìm kiếm và thay thế cho văn bản nhưng không thay thế các từ có trong các thẻ h1|h2|h3|a|img|b|strong|i|u|p

    Các bác có hàm nào không giới thiệu cho mình với
    Cám ơn
     
    Last edited: Jan 11, 2024
  2. sincos

    sincos Bang Chúng

    DOM thôi.
     
  3. longhcm

    longhcm Sơ Nhập Giang Hồ

    DOM là gì thế, nói rõ hơn chút đi bạn
     
  4. Dang

    Dang Bang Chúng

    Bác tham khảo thử đoạn mã bên dưới. Hiện tại, không biết bác muốn thay thế các thẻ đó thành thẻ gì nên em để trống.
    PHP:
    <?php

    $html 
    '
    <h2 class="panel-title"><span>Mẹo an toàn khi giao dịch</span></h2>
    <ol>
    <li><strong style="color: #ff0000;">Chọn vị trí an toàn để gặp người bán.</strong></li>
    <li><span style="color: #ff0000;">Hạn chế giao dịch tiềm mặt.</span></li>
    <li><u style="color: #ff0000;">Cận thận với những đề nghị phi thực tế.</u></li>
    <li><span style="color: #ff0000;">Không giao tiền khi chưa thấy hàng.</span></li>
    <li><span style="color: #ff0000;">Không cọc với bất kỳ lý do gì.</span></li>
    </ol>
    '
    ;

    $html preg_replace_callback('~\</?([a-z0-9\-]+)\s?([^\>]+)?\>~si', function($matches)
    {

        if (
    preg_match('~^(h1|h2|h3|a|img|b|strong|i|u|p)$~mi'$matches[1]))
        {
            return 
    $matches[0];
        }

        return 
    '';

    }, 
    $html);

    echo 
    $html;

    ?>
     
    longhcm, xmenvn2510 and wpresources like this.
  5. xmenvn2510

    xmenvn2510 Moderator + MiddleMan Staff Member

    Chi tiết và chuyên nghiệp quá :D
     
    Dang likes this.
  6. longhcm

    longhcm Sơ Nhập Giang Hồ

    Cám ơn bạn đã trả lời
    Tiêu đề mình có nhầm chút chỉ những thẻ (h1|h2|h3|a|img) này

    Ví dụ đoạn html của bạn mình muốn thay chữ "an toàn" thành "<a href=“#”>an toàn</a>"
    Nhưng chữ "an toàn" nằm trong H2 nên không được thay thế và tìm tiếp thì gặp
    <li><strong style="color: #ff0000;">Chọn vị trí an toàn để gặp người bán.</strong></li>
    sẽ thay bằng
    <li><strong style="color: #ff0000;">Chọn vị trí <a href=“#”>an toàn</a> để gặp người bán.</strong></li>
    Sau khi thay được 1 lần là dừng, không thay tiếp nữa

    Mình sử dụng thế này nhưng không thành công

    Code:
            foreach ($links as $link) {
                list($keywords, $url) = explode('|', $link);
                $keywordsArray = explode(',', $keywords);
                //Đảo random keyword
                shuffle($keywordsArray);
    
                // Tách từng từ khóa và kiểm tra điều kiện
                foreach ($keywordsArray as $keyword) {
                    // Kiểm tra trong thẻ <img>
                    $patternImg = '/(<img.*?(' . preg_quote($keyword, '/') . ').*?>)/iu';
                    // Kiểm tra trong thẻ <a>
                    $patternA = '/(<a.*?(' . preg_quote($keyword, '/') . ').*?<\/a>)/iu';
                    // Kiểm tra trong các thẻ còn lại
                    $patternNonImg = '/<(h1|h2|h3).*?(' . preg_quote($keyword, '/') . ').*?<\/(h1|h2|h3)>/iu';
    
                    if (!preg_match($patternImg, $content) && !preg_match($patternNonImg, $content) && !preg_match($patternA, $content)) {
                        // Thoả điều kiện, thực hiện thay thế từ khóa bằng liên kết
                        $pattern = '/(' . preg_quote($keyword, '/') . ')/iu';
                        $content = preg_replace($pattern, '<a href="' . $site_url .'/'. $url . '">$1</a>', $content, 1);
                        $i++;
                    }
                    break;
                }
                if ($i >= 5) break;
            }
     
  7. Dang

    Dang Bang Chúng

    Em tay ngang, vọc vạch thôi bác ah!

    Case này đợt trước em có làm rồi! Nhiều cái phải xử lý, duyệt DOM thì hơi lâu và tốn tài nguyên.
    Do trong mã html, các thẻ <h1>, <h2>, <h3> có thể chứa thẻ <a> hoặc thẻ <img>; và trong thẻ <a> có thể chứa thẻ <img> nên:
    1. ẨN các thẻ đó vào 1 biến riêng theo TUẦN TỰ <h1>, <h2>, <h3> sau đó mới đến <a> và <img>.
    2. Tìm kiếm và thay thế từ khóa.
    3. HIỆN các thẻ đã ẩn ở bước 1 theo chỉ mục.
    PHP:
    <?php

    $html 
    '
    <h2 class="panel-title"><span>Mẹo an toàn khi giao dịch</span></h2>
    <ol>
    <li><strong style="color: #ff0000;">Chọn vị trí an toàn để gặp người bán.</strong></li>
    <li><span style="color: #ff0000;">Hạn chế giao dịch tiềm mặt.</span></li>
    <li><u style="color: #ff0000;">Cận thận với những đề nghị phi thực tế.</u></li>
    <li><span style="color: #ff0000;">Không giao tiền khi chưa thấy hàng.</span></li>
    <li><span style="color: #ff0000;">Không cọc với bất kỳ lý do gì.</span></li>
    </ol>
    '
    ;


    // step 1
    $tags = array();

    foreach (
    explode('|''h1|h2|h3|a|img') as $tag)
    {

        
    $html preg_replace_callback(sprintf('~\<(%s)[^\>]*?\>(.*?\</\\1\>)?~si'$tag), function ($matches) use (&$tags)
        {

            
    $i count($tags);

            
    $tags[$i] = $matches[0];

            return 
    sprintf('$replace:tags:%s'$i);

        }, 
    $html);

    }


    // step 2
    $html preg_replace('~an toàn~ui''<a href="#" title="$0">$0</a>'$html1);


    // step 3
    $html preg_replace_callback('~\$replace\:tags\:([0-9]+)~', function ($index) use ($tags)
    {

        if (isset(
    $tags[$index[1]]))
        {
            return 
    $tags[$index[1]];
        }

        return 
    '';

    }, 
    $html);


    // output
    echo $html;

    ?>
     
    xmenvn2510 and longhcm like this.
  8. mmo2013

    mmo2013 Khách Qua Đường