str_replace, замена слова на div приводит к разрыву тега p

Приведенный ниже код ищет в контенте WordPress слова и заменяет эти слова ссылкой и элементом div. Это создает проблему, когда div закрывает тег <p>, в который он был вставлен.

$myposts = get_pages(args...);
$replace = array();
$i = 1;

foreach( $myposts as $post ) {
    setup_postdata($post);
    $replace[get_the_title()] = '<a href="#popupBasic' . $i . '" data-rel="popup">' . get_the_title() . '</a><div data-role="popup" class="tooltipBox" id="popupBasic' . $i . '">' . get_the_content() . '</div>';
    $i++;
}

$text = str_replace(array_keys($replace), $replace, $text);

Почему str_replace так ломает тег <p>?

<div>
    <p>Some random text thats been <a href="#" class="link">cutt</a></p><div style="display: none;"><!-- placeholder --></div> off.<p></p>
</div>

Если это нельзя исправить в PHP, можем ли мы исправить это с помощью jQuery? Я хочу вернуть слово, которое было отрезано, в данном случае "отключено". в тег <p>, который закрывается после ссылки. А также убрать пустой тег <p> в конце.


person halliewuud    schedule 13.11.2012    source источник
comment
Это адекватное поведение. Вопрос в том, что вы хотите получить в итоге?   -  person Blazemonger    schedule 13.11.2012
comment
Почему вы str_replace'ируете то, что явно является DOMDocument   -  person Elias Van Ootegem    schedule 13.11.2012
comment
@EliasVanOotegem: Это явно не так, он делает PHP на стороне сервера.   -  person T.J. Crowder    schedule 13.11.2012
comment
DOMDocument.   -  person moonwave99    schedule 13.11.2012
comment
Если ваш div ДОЛЖЕН быть div, добавьте его в конец документа и расположите абсолютно. Если это не так, используйте вместо этого диапазон и используйте CSS, чтобы сделать его display:block, если это необходимо.   -  person Blazemonger    schedule 13.11.2012
comment
@T.J.Crowder: moonwave99 связан с тем, к чему я стремился: просто анализировать HTML вместо того, чтобы рассматривать его как строку   -  person Elias Van Ootegem    schedule 13.11.2012
comment
@EliasVanOotegem: я думаю, было бы проблематично ввести это в середину страницы WordPress. Или, по крайней мере, дорого с точки зрения производительности. Весь дух кода WordPress является текстовым. (Я не говорю, что это должно быть, просто так...)   -  person T.J. Crowder    schedule 13.11.2012


Ответы (1)


p элементы содержат фразовое содержание. div недействителен во фразовом содержании. , он действителен в потоковом содержании . (Поместить div внутри p все равно, что поместить p внутри p.) Таким образом, браузер максимально использует недопустимую разметку.

Попробуйте использовать span вместо div.

person T.J. Crowder    schedule 13.11.2012
comment
Спасибо, я скопировал разметку отсюда. jquerymobile.com/demos/1.2.0/docs/pages/ всплывающее окно/index.html - person halliewuud; 13.11.2012
comment
@halliewuud: В этой разметке есть p внутри div. Это верно, div может содержать p (содержимое div является потоковым). Ваша разметка пытается сделать это наоборот. - person T.J. Crowder; 13.11.2012
comment
@TJ Это потому, что str_replace заменяет слово внутри тега ‹p›. И код, который я вставил, генерируется jquery mobile. - person halliewuud; 13.11.2012
comment
@halliewuud: я не вижу ничего в мобильных материалах jQuery, на которые вы ссылались, которые пытались поместить div внутри p. Для того, что делаете вы, а не для того, что делают они, больше подходит span. - person T.J. Crowder; 13.11.2012