Trong khi tôi hiểu rằng muốn mặt trước phải gọn gàng nhất có thể và do đó nói rằng bạn muốn một giải pháp PHP ...
Cá nhân, tôi đã dành khá nhiều thời gian cho việc này chỉ để giải trí và tôi tiếp tục tìm ra cách phá vỡ kết hợp regex (do đó, tại sao không sử dụng PHP mà không có tiện ích bổ sung thư viện được thiết kế đặc biệt để duyệt qua HTML, như đã đề cập trong liên kết ở trên) ...
Ví dụ:
Quy tắc của ảnh chụp màn hình này sẽ khớp <p>
hoặc thậm chí <P >
(khớp đơn giản nhất, chưa thử đối với các thẻ P đã có một lớp hoặc có các thuộc tính khác nhưng không phải là một lớp), nhưng hãy xem rằng nó phải được khớp với toàn bộ khối thẻ đóng (trong đó Regex PHP cho HTML rơi ra tại các đường nối) ... mũi tên chỉ vào nơi thẻ P đóng và thẻ P mở nằm trên cùng một dòng và do đó, nếu bạn tính đây là TÌM và sau đó thay thế <p
bằng <p class="my-class"
, bạn ' d được thêm my-class
vào đoạn văn sai.
Nếu bạn không muốn trường hợp sử dụng "mọi kịch bản" như vậy, thì có thể thực hiện được thông qua regex. Nếu bạn thu hẹp phạm vi của bạn một chút.
Nếu bạn quyết định giới hạn phạm vi của mình, bạn có thể quan tâm đến thông tin này:
From wp-includes/default-filters.php
these run on the_content with default priority (10):
wptexturize
convert_smilies
convert_chars
wpautop
shortcode_unautop
prepend_attachment
shortcode renders may add new paragraphs and/or new images
do_shortcode runs on the_content priority 11 so we hook in afterwards so $content already has shortcodes rendered
*/
add_filter('the_content', 'se_16033', 15); //a priority higher than 11
Đây là một số mã bắt đầu nếu bạn tự ép mình xuống tuyến đường phức tạp này (thay vì thông qua jQuery):
function se_16033($content) {
if( !is_singular() || !is_main_query() //https://pippinsplugins.com/playing-nice-with-the-content-filter/
) {
return $content;
}
$content = force_balance_tags($content); //We do not want to be REGEXing on unbalanced HTML tags so we must make sure they are balanced before we get started -- garbage in, worse garbage out -- http://codex.wordpress.org/Data_Validation#HTML
$patterns = array();
$patterns[0] = '/quick/'; //first match p tags with existing classes because we just want to add an additional class
$patterns[1] = '/brown/'; //second, match p tags with space (e.g. style) but without class=""
$patterns[2] = '/fox/'; //third, match <p> tags without attributes
ksort($patterns);
$replacements = array();
$replacements[0] = 'slow';
$replacements[1] = 'black';
$replacements[2] = 'bear';
ksort($replacements);
preg_replace_all($patterns, $replacements, $content);
return $content;
}
Lưu ý việc sử dụng http://codex.wordpress.org/Function_Reference/force_balance_tags
Theo mặc định, nó được sử dụng trên Excerpt và Comments Nếu bạn nhìn vào nguồn của nó, nó thực sự sử dụng REGEX: https: //core.trac.wordpress. org / browser / tags / 4.1 / src / wp-gộp / format.php # L1453
SIDENOTE Tôi cho rằng lý do họ dự phòng (không lý tưởng) khi sử dụng REGEX là do nhu cầu của WP chạy trên hầu hết mọi cấu hình PHP của máy chủ có thể tưởng tượng được (nghĩa là không muốn tải thư viện trong trường hợp tiện ích mở rộng PHP bị tắt). Bạn có thể chọn tải một thư viện PHP được thiết kế để thực hiện điều này trong giải pháp của riêng bạn. / SIDENote
Đó là toàn bộ rất nhiều mã được chạy mỗi lần is_singular()
. Như vậy, tôi không chắc rằng nó đáng để sử dụng làm nguồn cảm hứng cho một số giải pháp PHP phức tạp khi trang web của bạn có khả năng đã sử dụng JS / jQuery.
- Có phải lớp P này bằng cách nào đó cần phải hoạt động ngay cả trên các trình duyệt không hỗ trợ JS?
- Bạn có phải là một chuyên gia hiệu suất über? Nếu có, hiện tại bạn có sử dụng jQuery nào trên trang web của mình không (ví dụ: thanh trượt, chuyển động, v.v.)? Nếu có, jQuery tối giản cần thiết để làm điều này sẽ không thêm phình to. Chỉ cần đi với nó.
- Nếu bạn KHÔNG tải jQuery ở mặt trước, chúng tôi có thể đưa ra một cách JavaScript thuần túy để thực hiện điều này (tức là không thông qua jQuery)
Hãy chia sẻ suy nghĩ của bạn.
[^<]*
là quá hẹp, vì nó sẽ không xem xét khoảng thời gian xảy ra trong các đoạn văn.