str_replace в html-контенте не работает

У меня есть этот HTML-контент:

$test = '<section><div class="row">
        <div class="col-xs-12" data-type="container-content">
        <section data-type="component-photo"><div class="photo-panel">
        <img src="http://somewhere.com/XpV8lCLD6pChrysanthemum.jpg" width="100%" height="" style="display: inline-block;">
</div></section></div>
</div></section>';

И у меня есть этот код для str_replace, чтобы добавить закрывающий тег для img:

$new = str_replace('"></div>', '"/></div>', $test);

echo $new;

При проверке этого с помощью элемента проверки изображение не закрывается, как ожидалось. Что я могу делать неправильно здесь?

Дополнительные примечания:

Мне нужен закрывающий тег для работы PHPWord. Кроме того, значение $test взято из $_POST, поскольку оно передается через AJAX.

Спасибо


person magicianiam    schedule 14.01.2018    source источник
comment
Потому что есть разрыв строки   -  person u_mulder    schedule 14.01.2018
comment
Я попытался удалить разрыв строки, но содержимое не было заменено   -  person magicianiam    schedule 14.01.2018
comment
Элемент проверки (в хроме?) Никогда не показывает закрывающую косую черту на изображении. В этом нет необходимости, потому что элементы img неявно закрываются. Вам никогда не нужно закрывать тег img с помощью /›, если вы не хотите использовать строгий xhtml вместо более распространенного языка html. То же самое относится и к таким элементам, как hr, br, input и meta.   -  person René    schedule 14.01.2018
comment
@René Я использую PHPWord, и когда тег img пропускает его, он закрывается /, он возвращает ошибку.   -  person magicianiam    schedule 14.01.2018
comment
Это важная информация, которую нужно добавить к вашему вопросу. Вы что-то говорите об элементе проверки (в неизвестном браузере), но для браузеров не имеет значения его закрытие, и с учетом этого я подумал, что это неуместный вопрос для решения.   -  person René    schedule 14.01.2018
comment
Я обновил вопрос. Я все еще пытаюсь найти способ обойти это   -  person magicianiam    schedule 14.01.2018


Ответы (2)


Между тегом и закрывающим тегом есть новая строка. Вы должны либо переформатировать переменную $test, либо использовать:

$new = preg_replace('/>[\n\r]<\/div>/', '/></div>', $test);

Однако здесь вы находитесь на опасной территории, так как все спички будут заменены. HTML – это язык, который не работает с регулярными выражениями.

Гораздо лучше решить проблему до того, как она примет html-форму, если это возможно.

person Ghlen    schedule 14.01.2018
comment
Запускается скрипт, который по какой-то причине изменяет его, когда он превращается в HTML, поэтому лучшее, что я мог бы здесь, это манипулировать им в php - person magicianiam; 14.01.2018
comment
Что ж, в таком случае это отлично подойдет для этой простой строки. - person Ghlen; 14.01.2018
comment
Выражение не соответствует моей строке. Я проверил это на RegExr - person magicianiam; 14.01.2018
comment
Это происходит, когда я проверяю это... шаблон, который вам нужно ввести между / и /g: ›[\n\r]‹\/div›. Когда я запускаю php-скрипт, он также работает. - person Ghlen; 14.01.2018

чтобы сделать то, что вы ищете, вам нужно найти текст в этой строке (другие ответы также говорят более прямо - проблема в разрыве строки.

$new = str_replace('ck;">\n</div><section>','ck;">\n</div></div><section>',$test);
person Apps-n-Add-Ons    schedule 14.01.2018
comment
Конечные строки перед "> являются динамическими, поэтому их нельзя все время правильно угадывать. - person magicianiam; 14.01.2018
comment
Не могли бы Вы уточнить? › мало что говорит — там много. Дело в том, что вы должны найти что-то, что «поддается проверке», и использовать это. Я корректирую свой ответ в соответствии с тем, что, по моему мнению, вы ищете, хотя догадаться, что вы имеете в виду, затрудняет ответ. - person Apps-n-Add-Ons; 14.01.2018
comment
Извините, но это самая конкретная часть контента, которую я нашел постоянной. Мне бы понравилось, если бы я мог получить его более конкретным, а также. Спасибо - person magicianiam; 14.01.2018