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
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;?>
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; }
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>', $html, 1);// 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);// outputecho $html;?>