заменить строковый шаблон в тексте HTML на PHP - PullRequest
1 голос
/ 06 марта 2012

Для своего клиента я написал собственный веб-редактор WYSIWYG HTML.Это позволяет им форматировать основной текст HTML и вставлять изображения.Когда они вставляют изображения, я вставляю их с рисунком типа ##image1##.Созданный HTML может выглядеть примерно так:

<p>some text and some more text</p>
<p>some text and some <b>bold text</b></p>
<div>##image1##</div>
<p>more text can follow here</p>
<div>##image2##</div>

При выводе этого HTML-кода я выполняю поиск по нему, заменяю вхождения для изображений и заменяю ##image1##, ##image2## и т. Д. На HTML-разметку, которая фактически отображаетизображений.Мой код замены здесь:

// first find all occurrences of image string
preg_match_all('|##(.+)##|', $inputHTML, $matches);

for every match in $inputHTML
    $output = preg_replace('|##(.+)##|', $imageHTML, $inputHTML, 1 );

Это будет работать много раз, но в некоторых вариантах входной HTML будет анализировать странный результат.Один из HTML-кодов, который дает странный результат:

<div>##image1##</div><p class="align-justify"><strong>Peter Dekleva</strong>, <strong>Damir Lisica</strong>, <strong>Anej Kočevar</strong> in <strong>Gregor Jakac</strong> so glasbeniki, ki v svoji glasbi združujejo silovite  instrumentalne vložke, markantne melodije in močna besedila.</p><div>##image2##</div><p class="align-justify">Video dvojček skladbe Brez strahu torej prikazuje oblico sproščenih trenutkov iz zaodrja, veličasnih posnetkov s koncertnega dogajanja, priprav na nastope, nepredvidljive zaključke noči.</p>

Если я отредактирую этот HTML-код и добавлю тормоз строки перед <div>##image2##</div>, он будет проанализирован, и все в порядке.Есть идеи, что здесь происходит и почему у меня проблемы?

Я также открыт для предложений о лучшем способе сделать это.Я могу вставить что-то еще вместо ##image1## при вставке изображения в мой редактор WYSIWYG ... Спасибо

Ответы [ 2 ]

1 голос
/ 06 марта 2012

Это потому, что модификатор + является жадным. Так что это будет соответствовать всему до последнего экземпляра ##. Попробуйте добавить ? после +, чтобы изменить его на неряшливый.

|##(.+?)##|

Причина, по которой разрыв строки устраняет проблему, заключается в том, что по умолчанию . не соответствует разрывам строк. однако, если бы вы сделали вместо этого: |##(.+)##|s разрыв строки не решил бы проблему.

Редактировать Я только что заметил, что ответ Чака на ваш предыдущий вопрос также работал бы правильно.

0 голосов
/ 06 марта 2012

вы должны создать <img/> напрямую - но в любом случае, если вы не используете # для имен изображений, используйте ^# вместо .

также, если вы не уверены, что ## не будет использоваться в другом HTML, проверьте также <div>

<div>##(^#+)##</div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...